home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 4 / QRZ Ham Radio Callsign Database - Volume 4.iso / files / dsp / 56ktools / dspkgctr.z / dspkgctr / gcc / config / ns32k.md < prev    next >
Text File  |  1992-06-08  |  66KB  |  2,562 lines

  1. ;; BUGS:
  2. ;; Insert no-op between an insn with memory read-write operands
  3. ;;   following by a scale-indexing operation.
  4. ;; The Sequent assembler does not allow addresses to be used
  5. ;;   except in insns which explicitly compute an effective address.
  6. ;;   I.e., one cannot say "cmpd _p,@_x"
  7. ;; Implement unsigned multiplication??
  8.  
  9. ;;- Machine descrption for GNU compiler
  10. ;;- ns32000 Version
  11. ;;   Copyright (C) 1988 Free Software Foundation, Inc.
  12. ;;   Contributed by Michael Tiemann (tiemann@mcc.com)
  13.  
  14. ;; This file is part of GNU CC.
  15.  
  16. ;; GNU CC is free software; you can redistribute it and/or modify
  17. ;; it under the terms of the GNU General Public License as published by
  18. ;; the Free Software Foundation; either version 1, or (at your option)
  19. ;; any later version.
  20.  
  21. ;; GNU CC is distributed in the hope that it will be useful,
  22. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  23. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  24. ;; GNU General Public License for more details.
  25.  
  26. ;; You should have received a copy of the GNU General Public License
  27. ;; along with GNU CC; see the file COPYING.  If not, write to
  28. ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  29.  
  30.  
  31. ;;- Instruction patterns.  When multiple patterns apply,
  32. ;;- the first one in the file is chosen.
  33. ;;-
  34. ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
  35. ;;-
  36. ;;- cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code
  37. ;;- updates for most instructions.
  38.  
  39. ; tstsi is first test insn so that it is the one to match
  40. ; a constant argument.
  41.  
  42. (define_insn "tstsi"
  43.   [(set (cc0)
  44.     (match_operand:SI 0 "general_operand" "rmn"))]
  45.   ""
  46.   "*
  47. { cc_status.flags |= CC_REVERSED;
  48.   operands[1] = const0_rtx;
  49.   return \"cmpqd %1,%0\"; }")
  50.  
  51. (define_insn "tsthi"
  52.   [(set (cc0)
  53.     (match_operand:HI 0 "general_operand" "g"))]
  54.   ""
  55.   "*
  56. { cc_status.flags |= CC_REVERSED;
  57.   operands[1] = const0_rtx;
  58.   return \"cmpqw %1,%0\"; }")
  59.  
  60. (define_insn "tstqi"
  61.   [(set (cc0)
  62.     (match_operand:QI 0 "general_operand" "g"))]
  63.   ""
  64.   "*
  65. { cc_status.flags |= CC_REVERSED;
  66.   operands[1] = const0_rtx;
  67.   return \"cmpqb %1,%0\"; }")
  68.  
  69. (define_insn "tstdf"
  70.   [(set (cc0)
  71.     (match_operand:DF 0 "general_operand" "fmF"))]
  72.   "TARGET_32081"
  73.   "*
  74. { cc_status.flags |= CC_REVERSED;
  75.   operands[1] = dconst0_rtx;
  76.   return \"cmpl %1,%0\"; }")
  77.  
  78. (define_insn "tstsf"
  79.   [(set (cc0)
  80.     (match_operand:SF 0 "general_operand" "fmF"))]
  81.   "TARGET_32081"
  82.   "*
  83. { cc_status.flags |= CC_REVERSED;
  84.   operands[1] = fconst0_rtx;
  85.   return \"cmpf %1,%0\"; }")
  86.  
  87. ;; Put cmpsi first among compare insns so it matches two CONST_INT operands.
  88.  
  89. (define_insn "cmpsi"
  90.   [(set (cc0)
  91.     (compare (match_operand:SI 0 "general_operand" "rmn")
  92.          (match_operand:SI 1 "general_operand" "rmn")))]
  93.   ""
  94.   "*
  95. {
  96.   if (GET_CODE (operands[1]) == CONST_INT)
  97.     {
  98.       int i = INTVAL (operands[1]);
  99.       if (i <= 7 && i >= -8)
  100.     {
  101.       cc_status.flags |= CC_REVERSED;
  102.       return \"cmpqd %1,%0\";
  103.     }
  104.     }
  105.   cc_status.flags &= ~CC_REVERSED;
  106.   if (GET_CODE (operands[0]) == CONST_INT)
  107.     {
  108.       int i = INTVAL (operands[0]);
  109.       if (i <= 7 && i >= -8)
  110.     return \"cmpqd %0,%1\";
  111.     }
  112.   return \"cmpd %0,%1\";
  113. }")
  114.  
  115. (define_insn "cmphi"
  116.   [(set (cc0)
  117.     (compare (match_operand:HI 0 "general_operand" "g")
  118.          (match_operand:HI 1 "general_operand" "g")))]
  119.   ""
  120.   "*
  121. {
  122.   if (GET_CODE (operands[1]) == CONST_INT)
  123.     {
  124.       short i = INTVAL (operands[1]);
  125.     if (i <= 7 && i >= -8)
  126.       {
  127.     cc_status.flags |= CC_REVERSED;
  128.     if (INTVAL (operands[1]) > 7)
  129.       operands[1] = gen_rtx(CONST_INT, VOIDmode, i);
  130.     return \"cmpqw %1,%0\";
  131.       }
  132.     }
  133.   cc_status.flags &= ~CC_REVERSED;
  134.   if (GET_CODE (operands[0]) == CONST_INT)
  135.     {
  136.       short i = INTVAL (operands[0]);
  137.       if (i <= 7 && i >= -8)
  138.     {
  139.       if (INTVAL (operands[0]) > 7)
  140.         operands[0] = gen_rtx(CONST_INT, VOIDmode, i);
  141.       return \"cmpqw %0,%1\";
  142.     }
  143.     }
  144.   return \"cmpw %0,%1\";
  145. }")
  146.  
  147. (define_insn "cmpqi"
  148.   [(set (cc0)
  149.     (compare (match_operand:QI 0 "general_operand" "g")
  150.          (match_operand:QI 1 "general_operand" "g")))]
  151.   ""
  152.   "*
  153. {
  154.   if (GET_CODE (operands[1]) == CONST_INT)
  155.     {
  156.       char i = INTVAL (operands[1]);
  157.       if (i <= 7 && i >= -8)
  158.     {
  159.       cc_status.flags |= CC_REVERSED;
  160.       if (INTVAL (operands[1]) > 7)
  161.         operands[1] = gen_rtx(CONST_INT, VOIDmode, i);
  162.       return \"cmpqb %1,%0\";
  163.     }
  164.     }
  165.   cc_status.flags &= ~CC_REVERSED;
  166.   if (GET_CODE (operands[0]) == CONST_INT)
  167.     {
  168.       char i = INTVAL (operands[0]);
  169.       if (i <= 7 && i >= -8)
  170.     {
  171.       if (INTVAL (operands[0]) > 7)
  172.         operands[0] = gen_rtx(CONST_INT, VOIDmode, i);
  173.       return \"cmpqb %0,%1\";
  174.     }
  175.     }
  176.   return \"cmpb %0,%1\";
  177. }")
  178.  
  179. (define_insn "cmpdf"
  180.   [(set (cc0)
  181.     (compare (match_operand:DF 0 "general_operand" "fmF")
  182.          (match_operand:DF 1 "general_operand" "fmF")))]
  183.   "TARGET_32081"
  184.   "cmpl %0,%1")
  185.  
  186. (define_insn "cmpsf"
  187.   [(set (cc0)
  188.     (compare (match_operand:SF 0 "general_operand" "fmF")
  189.          (match_operand:SF 1 "general_operand" "fmF")))]
  190.   "TARGET_32081"
  191.   "cmpf %0,%1")
  192.  
  193. (define_insn "movdf"
  194.   [(set (match_operand:DF 0 "general_operand" "=&fg<")
  195.     (match_operand:DF 1 "general_operand" "fFg"))]
  196.   ""
  197.   "*
  198. {
  199.   if (FP_REG_P (operands[0]))
  200.     {
  201.       if (FP_REG_P (operands[1]) || GET_CODE (operands[1]) == CONST_DOUBLE)
  202.     return \"movl %1,%0\";
  203.       if (REG_P (operands[1]))
  204.     {
  205.       rtx xoperands[2];
  206.       xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
  207.       output_asm_insn (\"movd %1,tos\", xoperands);
  208.       output_asm_insn (\"movd %1,tos\", operands);
  209.       return \"movl tos,%0\";
  210.     }
  211.       return \"movl %1,%0\";
  212.     }
  213.   else if (FP_REG_P (operands[1]))
  214.     {
  215.       if (REG_P (operands[0]))
  216.     {
  217.       output_asm_insn (\"movl %1,tos\;movd tos,%0\", operands);
  218.       operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
  219.       return \"movd tos,%0\";
  220.     }
  221.       else
  222.         return \"movl %1,%0\";
  223.     }
  224.   return output_move_double (operands);
  225. }")
  226.  
  227. (define_insn "movsf"
  228.   [(set (match_operand:SF 0 "general_operand" "=fg<")
  229.     (match_operand:SF 1 "general_operand" "fFg"))]
  230.   ""
  231.   "*
  232. {
  233.   if (FP_REG_P (operands[0]))
  234.     {
  235.       if (GET_CODE (operands[1]) == REG && REGNO (operands[1]) < 8)
  236.     return \"movd %1,tos\;movf tos,%0\";
  237.       else
  238.     return \"movf %1,%0\";
  239.     }
  240.   else if (FP_REG_P (operands[1]))
  241.     {
  242.       if (REG_P (operands[0]))
  243.     return \"movf %1,tos\;movd tos,%0\";
  244.       return \"movf %1,%0\";
  245.     }
  246.   else if (GET_CODE (operands[1]) == CONST_DOUBLE)
  247.     {
  248.       union {int i[2]; float f; double d;} convrt;
  249.       convrt.i[0] = CONST_DOUBLE_LOW (operands[1]);
  250.       convrt.i[1] = CONST_DOUBLE_HIGH (operands[1]);
  251.       convrt.f = convrt.d;
  252.  
  253.       /* Is there a better machine-independent way to to this?  */
  254.       operands[1] = gen_rtx (CONST_INT, VOIDmode, convrt.i[0]);
  255.       return \"movd %1,%0\";
  256.     }
  257.   else return \"movd %1,%0\";
  258. }")
  259.  
  260. (define_insn ""
  261.   [(set (match_operand:TI 0 "memory_operand" "=m")
  262.     (match_operand:TI 1 "memory_operand" "m"))]
  263.   ""
  264.   "movmd %1,%0,4")
  265.  
  266. (define_insn "movdi"
  267.   [(set (match_operand:DI 0 "general_operand" "=&g<")
  268.     (match_operand:DI 1 "general_operand" "gF"))]
  269.   ""
  270.   "* return output_move_double (operands); ")
  271.  
  272. ;; This special case must precede movsi.
  273. (define_insn ""
  274.   [(set (reg:SI 17)
  275.     (match_operand:SI 0 "general_operand" "rmn"))]
  276.   ""
  277.   "lprd sp,%0")
  278.  
  279. (define_insn "movsi"
  280.   [(set (match_operand:SI 0 "general_operand" "=g<")
  281.     (match_operand:SI 1 "general_operand" "gx"))]
  282.   ""
  283.   "*
  284. { if (GET_CODE (operands[1]) == CONST_INT)
  285.     {
  286.       int i = INTVAL (operands[1]);
  287.       if (i <= 7 && i >= -8)
  288.     return \"movqd %1,%0\";
  289.       if (i < 0x4000 && i >= -0x4000)
  290. #ifdef GNX_V3
  291.     return \"addr %c1,%0\";
  292. #else
  293.     return \"addr @%c1,%0\";
  294. #endif
  295.       return \"movd %1,%0\";
  296.     }
  297.   else if (GET_CODE (operands[1]) == REG)
  298.     {
  299.       if (REGNO (operands[1]) < 16)
  300.         return \"movd %1,%0\";
  301.       else if (REGNO (operands[1]) == FRAME_POINTER_REGNUM)
  302.     {
  303.       if (GET_CODE(operands[0]) == REG)
  304.         return \"sprd fp,%0\";
  305.       else
  306.         return \"addr 0(fp),%0\" ;
  307.     }
  308.       else if (REGNO (operands[1]) == STACK_POINTER_REGNUM)
  309.     {
  310.       if (GET_CODE(operands[0]) == REG)
  311.         return \"sprd sp,%0\";
  312.       else
  313.         return \"addr 0(sp),%0\" ;
  314.     }
  315.       else abort (0);
  316.     }
  317.   else if (GET_CODE (operands[1]) == MEM)
  318.     return \"movd %1,%0\";
  319.   /* Check if this effective address can be
  320.      calculated faster by pulling it apart.  */
  321.   if (REG_P (operands[0])
  322.       && GET_CODE (operands[1]) == MULT
  323.       && GET_CODE (XEXP (operands[1], 1)) == CONST_INT
  324.       && (INTVAL (XEXP (operands[1], 1)) == 2
  325.       || INTVAL (XEXP (operands[1], 1)) == 4))
  326.     {
  327.       rtx xoperands[3];
  328.       xoperands[0] = operands[0];
  329.       xoperands[1] = XEXP (operands[1], 0);
  330.       xoperands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (XEXP (operands[1], 1)) >> 1);
  331.       return output_shift_insn (xoperands);
  332.     }
  333.   return \"addr %a1,%0\";
  334. }")
  335.  
  336. (define_insn "movhi"
  337.   [(set (match_operand:HI 0 "general_operand" "=g<")
  338.     (match_operand:HI 1 "general_operand" "g"))]
  339.   ""
  340.   "*
  341. {
  342.   if (GET_CODE (operands[1]) == CONST_INT)
  343.     {
  344.       short i = INTVAL (operands[1]);
  345.       if (i <= 7 && i >= -8)
  346.     {
  347.       if (INTVAL (operands[1]) > 7)
  348.         operands[1] =
  349.           gen_rtx (CONST_INT, VOIDmode, i);
  350.       return \"movqw %1,%0\";
  351.     }
  352.     }
  353.   return \"movw %1,%0\";
  354. }")
  355.  
  356. (define_insn "movstricthi"
  357.   [(set (strict_low_part (match_operand:HI 0 "general_operand" "+r"))
  358.     (match_operand:HI 1 "general_operand" "g"))]
  359.   ""
  360.   "*
  361. {
  362.   if (GET_CODE (operands[1]) == CONST_INT
  363.       && INTVAL(operands[1]) <= 7 && INTVAL(operands[1]) >= -8)
  364.     return \"movqw %1,%0\";
  365.   return \"movw %1,%0\";
  366. }")
  367.  
  368. (define_insn "movqi"
  369.   [(set (match_operand:QI 0 "general_operand" "=g<")
  370.     (match_operand:QI 1 "general_operand" "g"))]
  371.   ""
  372.   "*
  373. { if (GET_CODE (operands[1]) == CONST_INT)
  374.     {
  375.       char char_val = (char)INTVAL (operands[1]);
  376.       if (char_val <= 7 && char_val >= -8)
  377.     {
  378.       if (INTVAL (operands[1]) > 7)
  379.         operands[1] =
  380.           gen_rtx (CONST_INT, VOIDmode, char_val);
  381.       return \"movqb %1,%0\";
  382.     }
  383.     }
  384.   return \"movb %1,%0\";
  385. }")
  386.  
  387. (define_insn "movstrictqi"
  388.   [(set (strict_low_part (match_operand:QI 0 "general_operand" "+r"))
  389.     (match_operand:QI 1 "general_operand" "g"))]
  390.   ""
  391.   "*
  392. {
  393.   if (GET_CODE (operands[1]) == CONST_INT
  394.       && INTVAL(operands[1]) < 8 && INTVAL(operands[1]) > -9)
  395.     return \"movqb %1,%0\";
  396.   return \"movb %1,%0\";
  397. }")
  398.  
  399. ;; The definition of this insn does not really explain what it does,
  400. ;; but it should suffice
  401. ;; that anything generated as this insn will be recognized as one
  402. ;; and that it won't successfully combine with anything.
  403. (define_insn "movstrsi"
  404.   [(set (match_operand:BLK 0 "general_operand" "=g")
  405.     (match_operand:BLK 1 "general_operand" "g"))
  406.    (use (match_operand:SI 2 "general_operand" "rmn"))
  407.    (clobber (reg:SI 0))
  408.    (clobber (reg:SI 1))
  409.    (clobber (reg:SI 2))]
  410.   ""
  411.   "*
  412. {
  413.   if (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)
  414.     abort ();
  415.   operands[0] = XEXP (operands[0], 0);
  416.   operands[1] = XEXP (operands[1], 0);
  417.   if (GET_CODE (operands[0]) == MEM)
  418.     if (GET_CODE (operands[1]) == MEM)
  419.       output_asm_insn (\"movd %0,r2\;movd %1,r1\", operands);
  420.     else
  421.       output_asm_insn (\"movd %0,r2\;addr %a1,r1\", operands);
  422.   else if (GET_CODE (operands[1]) == MEM)
  423.     output_asm_insn (\"addr %a0,r2\;movd %1,r1\", operands);
  424.   else
  425.     output_asm_insn (\"addr %a0,r2\;addr %a1,r1\", operands);
  426.  
  427.   if (GET_CODE (operands[2]) == CONST_INT && (INTVAL (operands[2]) & 0x3) == 0)
  428.     {
  429.       operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) >> 2);
  430.       if ((unsigned) INTVAL (operands[2]) <= 7)
  431.     return \"movqd %2,r0\;movsd\";
  432.       else 
  433.     return \"movd %2,r0\;movsd\";
  434.     }
  435.   else
  436.     {
  437.       return \"movd %2,r0\;movsb\";
  438.     }
  439. }")
  440.  
  441. ;; Extension and truncation insns.
  442. ;; Those for integer source operand
  443. ;; are ordered widest source type first.
  444.  
  445. (define_insn "truncsiqi2"
  446.   [(set (match_operand:QI 0 "general_operand" "=g<")
  447.     (truncate:QI (match_operand:SI 1 "general_operand" "rmn")))]
  448.   ""
  449.   "movb %1,%0")
  450.  
  451. (define_insn "truncsihi2"
  452.   [(set (match_operand:HI 0 "general_operand" "=g<")
  453.     (truncate:HI (match_operand:SI 1 "general_operand" "rmn")))]
  454.   ""
  455.   "movw %1,%0")
  456.  
  457. (define_insn "trunchiqi2"
  458.   [(set (match_operand:QI 0 "general_operand" "=g<")
  459.     (truncate:QI (match_operand:HI 1 "general_operand" "g")))]
  460.   ""
  461.   "movb %1,%0")
  462.  
  463. (define_insn "extendhisi2"
  464.   [(set (match_operand:SI 0 "general_operand" "=g<")
  465.     (sign_extend:SI (match_operand:HI 1 "general_operand" "g")))]
  466.   ""
  467.   "movxwd %1,%0")
  468.  
  469. (define_insn "extendqihi2"
  470.   [(set (match_operand:HI 0 "general_operand" "=g<")
  471.     (sign_extend:HI (match_operand:QI 1 "general_operand" "g")))]
  472.   ""
  473.   "movxbw %1,%0")
  474.  
  475. (define_insn "extendqisi2"
  476.   [(set (match_operand:SI 0 "general_operand" "=g<")
  477.     (sign_extend:SI (match_operand:QI 1 "general_operand" "g")))]
  478.   ""
  479.   "movxbd %1,%0")
  480.  
  481. (define_insn "extendsfdf2"
  482.   [(set (match_operand:DF 0 "general_operand" "=fm<")
  483.     (float_extend:DF (match_operand:SF 1 "general_operand" "fmF")))]
  484.   "TARGET_32081"
  485.   "movfl %1,%0")
  486.  
  487. (define_insn "truncdfsf2"
  488.   [(set (match_operand:SF 0 "general_operand" "=fm<")
  489.     (float_truncate:SF (match_operand:DF 1 "general_operand" "fmF")))]
  490.   "TARGET_32081"
  491.   "movlf %1,%0")
  492.  
  493. (define_insn "zero_extendhisi2"
  494.   [(set (match_operand:SI 0 "general_operand" "=g<")
  495.     (zero_extend:SI (match_operand:HI 1 "general_operand" "g")))]
  496.   ""
  497.   "movzwd %1,%0")
  498.  
  499. (define_insn "zero_extendqihi2"
  500.   [(set (match_operand:HI 0 "general_operand" "=g<")
  501.     (zero_extend:HI (match_operand:QI 1 "general_operand" "g")))]
  502.   ""
  503.   "movzbw %1,%0")
  504.  
  505. (define_insn "zero_extendqisi2"
  506.   [(set (match_operand:SI 0 "general_operand" "=g<")
  507.     (zero_extend:SI (match_operand:QI 1 "general_operand" "g")))]
  508.   ""
  509.   "movzbd %1,%0")
  510.  
  511. ;; Fix-to-float conversion insns.
  512. ;; Note that the ones that start with SImode come first.
  513. ;; That is so that an operand that is a CONST_INT
  514. ;; (and therefore lacks a specific machine mode).
  515. ;; will be recognized as SImode (which is always valid)
  516. ;; rather than as QImode or HImode.
  517.  
  518. ;; Rumor has it that the National part does not correctly convert
  519. ;; constant ints to floats.  This conversion is therefore disabled.
  520. ;; A register must be used to perform the conversion.
  521.  
  522. (define_insn "floatsisf2"
  523.   [(set (match_operand:SF 0 "general_operand" "=fm<")
  524.     (float:SF (match_operand:SI 1 "general_operand" "rm")))]
  525.   "TARGET_32081"
  526.   "movdf %1,%0")
  527.  
  528. (define_insn "floatsidf2"
  529.   [(set (match_operand:DF 0 "general_operand" "=fm<")
  530.     (float:DF (match_operand:SI 1 "general_operand" "rm")))]
  531.   "TARGET_32081"
  532.   "movdl %1,%0")
  533.  
  534. (define_insn "floathisf2"
  535.   [(set (match_operand:SF 0 "general_operand" "=fm<")
  536.     (float:SF (match_operand:HI 1 "general_operand" "rm")))]
  537.   "TARGET_32081"
  538.   "movwf %1,%0")
  539.  
  540. (define_insn "floathidf2"
  541.   [(set (match_operand:DF 0 "general_operand" "=fm<")
  542.     (float:DF (match_operand:HI 1 "general_operand" "rm")))]
  543.   "TARGET_32081"
  544.   "movwl %1,%0")
  545.  
  546. (define_insn "floatqisf2"
  547.   [(set (match_operand:SF 0 "general_operand" "=fm<")
  548.     (float:SF (match_operand:QI 1 "general_operand" "rm")))]
  549.   "TARGET_32081"
  550.   "movbf %1,%0")
  551.  
  552. ; Some assemblers warn that this insn doesn't work.
  553. ; Maybe they know something we don't.
  554. ;(define_insn "floatqidf2"
  555. ;  [(set (match_operand:DF 0 "general_operand" "=fm<")
  556. ;    (float:DF (match_operand:QI 1 "general_operand" "rm")))]
  557. ;  "TARGET_32081"
  558. ;  "movbl %1,%0")
  559.  
  560. ;; Float-to-fix conversion insns.
  561. ;; The sequent compiler always generates "trunc" insns.
  562.  
  563. (define_insn "fixsfqi2"
  564.   [(set (match_operand:QI 0 "general_operand" "=g<")
  565.     (fix:QI (fix:SF (match_operand:SF 1 "general_operand" "fm"))))]
  566.   "TARGET_32081"
  567.   "truncfb %1,%0")
  568.  
  569. (define_insn "fixsfhi2"
  570.   [(set (match_operand:HI 0 "general_operand" "=g<")
  571.     (fix:HI (fix:SF (match_operand:SF 1 "general_operand" "fm"))))]
  572.   "TARGET_32081"
  573.   "truncfw %1,%0")
  574.  
  575. (define_insn "fixsfsi2"
  576.   [(set (match_operand:SI 0 "general_operand" "=g<")
  577.     (fix:SI (fix:SF (match_operand:SF 1 "general_operand" "fm"))))]
  578.   "TARGET_32081"
  579.   "truncfd %1,%0")
  580.  
  581. (define_insn "fixdfqi2"
  582.   [(set (match_operand:QI 0 "general_operand" "=g<")
  583.     (fix:QI (fix:DF (match_operand:DF 1 "general_operand" "fm"))))]
  584.   "TARGET_32081"
  585.   "trunclb %1,%0")
  586.  
  587. (define_insn "fixdfhi2"
  588.   [(set (match_operand:HI 0 "general_operand" "=g<")
  589.     (fix:HI (fix:DF (match_operand:DF 1 "general_operand" "fm"))))]
  590.   "TARGET_32081"
  591.   "trunclw %1,%0")
  592.  
  593. (define_insn "fixdfsi2"
  594.   [(set (match_operand:SI 0 "general_operand" "=g<")
  595.     (fix:SI (fix:DF (match_operand:DF 1 "general_operand" "fm"))))]
  596.   "TARGET_32081"
  597.   "truncld %1,%0")
  598.  
  599. ;; Unsigned
  600.  
  601. (define_insn "fixunssfqi2"
  602.   [(set (match_operand:QI 0 "general_operand" "=g<")
  603.     (unsigned_fix:QI (fix:SF (match_operand:SF 1 "general_operand" "fm"))))]
  604.   "TARGET_32081"
  605.   "truncfb %1,%0")
  606.  
  607. (define_insn "fixunssfhi2"
  608.   [(set (match_operand:HI 0 "general_operand" "=g<")
  609.     (unsigned_fix:HI (fix:SF (match_operand:SF 1 "general_operand" "fm"))))]
  610.   "TARGET_32081"
  611.   "truncfw %1,%0")
  612.  
  613. (define_insn "fixunssfsi2"
  614.   [(set (match_operand:SI 0 "general_operand" "=g<")
  615.     (unsigned_fix:SI (fix:SF (match_operand:SF 1 "general_operand" "fm"))))]
  616.   "TARGET_32081"
  617.   "truncfd %1,%0")
  618.  
  619. (define_insn "fixunsdfqi2"
  620.   [(set (match_operand:QI 0 "general_operand" "=g<")
  621.     (unsigned_fix:QI (fix:DF (match_operand:DF 1 "general_operand" "fm"))))]
  622.   "TARGET_32081"
  623.   "trunclb %1,%0")
  624.  
  625. (define_insn "fixunsdfhi2"
  626.   [(set (match_operand:HI 0 "general_operand" "=g<")
  627.     (unsigned_fix:HI (fix:DF (match_operand:DF 1 "general_operand" "fm"))))]
  628.   "TARGET_32081"
  629.   "trunclw %1,%0")
  630.  
  631. (define_insn "fixunsdfsi2"
  632.   [(set (match_operand:SI 0 "general_operand" "=g<")
  633.     (unsigned_fix:SI (fix:DF (match_operand:DF 1 "general_operand" "fm"))))]
  634.   "TARGET_32081"
  635.   "truncld %1,%0")
  636.  
  637. ;;; These are not yet used by GCC
  638. (define_insn "fix_truncsfqi2"
  639.   [(set (match_operand:QI 0 "general_operand" "=g<")
  640.     (fix:QI (match_operand:SF 1 "general_operand" "fm")))]
  641.   "TARGET_32081"
  642.   "truncfb %1,%0")
  643.  
  644. (define_insn "fix_truncsfhi2"
  645.   [(set (match_operand:HI 0 "general_operand" "=g<")
  646.     (fix:HI (match_operand:SF 1 "general_operand" "fm")))]
  647.   "TARGET_32081"
  648.   "truncfw %1,%0")
  649.  
  650. (define_insn "fix_truncsfsi2"
  651.   [(set (match_operand:SI 0 "general_operand" "=g<")
  652.     (fix:SI (match_operand:SF 1 "general_operand" "fm")))]
  653.   "TARGET_32081"
  654.   "truncfd %1,%0")
  655.  
  656. (define_insn "fix_truncdfqi2"
  657.   [(set (match_operand:QI 0 "general_operand" "=g<")
  658.     (fix:QI (match_operand:DF 1 "general_operand" "fm")))]
  659.   "TARGET_32081"
  660.   "trunclb %1,%0")
  661.  
  662. (define_insn "fix_truncdfhi2"
  663.   [(set (match_operand:HI 0 "general_operand" "=g<")
  664.     (fix:HI (match_operand:DF 1 "general_operand" "fm")))]
  665.   "TARGET_32081"
  666.   "trunclw %1,%0")
  667.  
  668. (define_insn "fix_truncdfsi2"
  669.   [(set (match_operand:SI 0 "general_operand" "=g<")
  670.     (fix:SI (match_operand:DF 1 "general_operand" "fm")))]
  671.   "TARGET_32081"
  672.   "truncld %1,%0")
  673.  
  674. ;;- All kinds of add instructions.
  675.  
  676. (define_insn "adddf3"
  677.   [(set (match_operand:DF 0 "general_operand" "=fm")
  678.     (plus:DF (match_operand:DF 1 "general_operand" "%0")
  679.          (match_operand:DF 2 "general_operand" "fmF")))]
  680.   "TARGET_32081"
  681.   "addl %2,%0")
  682.  
  683.  
  684. (define_insn "addsf3"
  685.   [(set (match_operand:SF 0 "general_operand" "=fm")
  686.     (plus:SF (match_operand:SF 1 "general_operand" "%0")
  687.          (match_operand:SF 2 "general_operand" "fmF")))]
  688.   "TARGET_32081"
  689.   "addf %2,%0")
  690.  
  691. (define_insn ""
  692.   [(set (reg:SI 17)
  693.     (plus:SI (reg:SI 17)
  694.          (match_operand:SI 0 "immediate_operand" "i")))]
  695.   "GET_CODE (operands[0]) == CONST_INT"
  696.   "*
  697. {
  698.   if (INTVAL (operands[0]) == 8)
  699.     return \"cmpd tos,tos # adjsp -8\";
  700.   if (INTVAL (operands[0]) == 4)
  701.     return \"cmpqd %$0,tos # adjsp -4\";
  702.   if (INTVAL (operands[0]) < 64 && INTVAL (operands[0]) > -64)
  703.     return \"adjspb %$%n0\";
  704.   else if (INTVAL (operands[0]) < 8192 && INTVAL (operands[0]) >= -8192)
  705.     return \"adjspw %$%n0\";
  706.   return \"adjspd %$%n0\";
  707. }")
  708.  
  709. (define_insn ""
  710.   [(set (match_operand:SI 0 "general_operand" "=g<")
  711.     (plus:SI (reg:SI 16)
  712.          (match_operand:SI 1 "immediate_operand" "i")))]
  713.   "GET_CODE (operands[1]) == CONST_INT"
  714.   "addr %c1(fp),%0")
  715.  
  716. (define_insn ""
  717.   [(set (match_operand:SI 0 "general_operand" "=g<")
  718.     (plus:SI (reg:SI 17)
  719.          (match_operand:SI 1 "immediate_operand" "i")))]
  720.   "GET_CODE (operands[1]) == CONST_INT"
  721.   "addr %c1(sp),%0")
  722.  
  723. (define_insn "addsi3"
  724.   [(set (match_operand:SI 0 "general_operand" "=g,=g<")
  725.     (plus:SI (match_operand:SI 1 "general_operand" "%0,%r")
  726.          (match_operand:SI 2 "general_operand" "rmn,n")))]
  727.   ""
  728.   "*
  729. {
  730.   if (which_alternative == 1)
  731.     return \"addr %c2(%1),%0\";
  732.   if (GET_CODE (operands[2]) == CONST_INT)
  733.     {
  734.       int i = INTVAL (operands[2]);
  735.  
  736.       if (i <= 7 && i >= -8)
  737.     return \"addqd %2,%0\";
  738.       else if (GET_CODE (operands[0]) == REG
  739.            && i < 0x4000 && i >= -0x4000)
  740.     return \"addr %c2(%0),%0\";
  741.     }
  742.   return \"addd %2,%0\";
  743. }")
  744.  
  745. (define_insn "addhi3"
  746.   [(set (match_operand:HI 0 "general_operand" "=g")
  747.     (plus:HI (match_operand:HI 1 "general_operand" "%0")
  748.          (match_operand:HI 2 "general_operand" "g")))]
  749.   ""
  750.   "*
  751. { if (GET_CODE (operands[2]) == CONST_INT)
  752.     {
  753.       int i = INTVAL (operands[2]);
  754.       if (i <= 7 && i >= -8)
  755.     return \"addqw %2,%0\";
  756.     }
  757.   return \"addw %2,%0\";
  758. }")
  759.  
  760. (define_insn ""
  761.   [(set (strict_low_part (match_operand:HI 0 "general_operand" "=r"))
  762.     (plus:HI (match_operand:HI 1 "general_operand" "0")
  763.          (match_operand:HI 2 "general_operand" "g")))]
  764.   ""
  765.   "*
  766. {
  767.   if (GET_CODE (operands[1]) == CONST_INT
  768.       && INTVAL (operands[1]) >-9 && INTVAL(operands[1]) < 8)
  769.     return \"addqw %1,%0\";
  770.   return \"addw %1,%0\";
  771. }")
  772.  
  773. (define_insn "addqi3"
  774.   [(set (match_operand:QI 0 "general_operand" "=g")
  775.     (plus:QI (match_operand:QI 1 "general_operand" "%0")
  776.          (match_operand:QI 2 "general_operand" "g")))]
  777.   ""
  778.   "*
  779. { if (GET_CODE (operands[2]) == CONST_INT)
  780.     {
  781.       int i = INTVAL (operands[2]);
  782.       if (i <= 7 && i >= -8)
  783.     return \"addqb %2,%0\";
  784.     }
  785.   return \"addb %2,%0\";
  786. }")
  787.  
  788. (define_insn ""
  789.   [(set (strict_low_part (match_operand:QI 0 "general_operand" "=r"))
  790.     (plus:QI (match_operand:QI 1 "general_operand" "0")
  791.          (match_operand:QI 2 "general_operand" "g")))]
  792.   ""
  793.   "*
  794. {
  795.   if (GET_CODE (operands[1]) == CONST_INT
  796.       && INTVAL (operands[1]) >-9 && INTVAL(operands[1]) < 8)
  797.     return \"addqb %1,%0\";
  798.   return \"addb %1,%0\";
  799. }")
  800.  
  801. ;;- All kinds of subtract instructions.
  802.  
  803. (define_insn "subdf3"
  804.   [(set (match_operand:DF 0 "general_operand" "=fm")
  805.     (minus:DF (match_operand:DF 1 "general_operand" "0")
  806.           (match_operand:DF 2 "general_operand" "fmF")))]
  807.   "TARGET_32081"
  808.   "subl %2,%0")
  809.  
  810. (define_insn "subsf3"
  811.   [(set (match_operand:SF 0 "general_operand" "=fm")
  812.     (minus:SF (match_operand:SF 1 "general_operand" "0")
  813.           (match_operand:SF 2 "general_operand" "fmF")))]
  814.   "TARGET_32081"
  815.   "subf %2,%0")
  816.  
  817. (define_insn ""
  818.   [(set (reg:SI 17)
  819.     (minus:SI (reg:SI 17)
  820.           (match_operand:SI 0 "immediate_operand" "i")))]
  821.   "GET_CODE (operands[0]) == CONST_INT"
  822.   "*
  823. {
  824.   if (GET_CODE(operands[0]) == CONST_INT && INTVAL(operands[0]) < 64
  825.       && INTVAL(operands[0]) > -64)
  826.     return \"adjspb %0\";
  827.   return \"adjspd %0\";
  828. }")
  829.  
  830. (define_insn "subsi3"
  831.   [(set (match_operand:SI 0 "general_operand" "=g")
  832.     (minus:SI (match_operand:SI 1 "general_operand" "0")
  833.           (match_operand:SI 2 "general_operand" "rmn")))]
  834.   ""
  835.   "*
  836. { if (GET_CODE (operands[2]) == CONST_INT)
  837.     {
  838.       int i = INTVAL (operands[2]);
  839.  
  840.       if (i <= 8 && i >= -7)
  841.         return \"addqd %$%n2,%0\";
  842.     }
  843.   return \"subd %2,%0\";
  844. }")
  845.  
  846. (define_insn "subhi3"
  847.   [(set (match_operand:HI 0 "general_operand" "=g")
  848.     (minus:HI (match_operand:HI 1 "general_operand" "0")
  849.           (match_operand:HI 2 "general_operand" "g")))]
  850.   ""
  851.   "*
  852. { if (GET_CODE (operands[2]) == CONST_INT)
  853.     {
  854.       int i = INTVAL (operands[2]);
  855.  
  856.       if (i <= 8 && i >= -7)
  857.         return \"addqw %$%n2,%0\";
  858.     }
  859.   return \"subw %2,%0\";
  860. }")
  861.  
  862. (define_insn ""
  863.   [(set (strict_low_part (match_operand:HI 0 "general_operand" "=r"))
  864.     (minus:HI (match_operand:HI 1 "general_operand" "0")
  865.           (match_operand:HI 2 "general_operand" "g")))]
  866.   ""
  867.   "*
  868. {
  869.   if (GET_CODE (operands[1]) == CONST_INT
  870.       && INTVAL (operands[1]) >-8 && INTVAL(operands[1]) < 9)
  871.     return \"addqw %$%n1,%0\";
  872.   return \"subw %1,%0\";
  873. }")
  874.  
  875. (define_insn "subqi3"
  876.   [(set (match_operand:QI 0 "general_operand" "=g")
  877.     (minus:QI (match_operand:QI 1 "general_operand" "0")
  878.           (match_operand:QI 2 "general_operand" "g")))]
  879.   ""
  880.   "*
  881. { if (GET_CODE (operands[2]) == CONST_INT)
  882.     {
  883.       int i = INTVAL (operands[2]);
  884.  
  885.       if (i <= 8 && i >= -7)
  886.     return \"addqb %$%n2,%0\";
  887.     }
  888.   return \"subb %2,%0\";
  889. }")
  890.  
  891. (define_insn ""
  892.   [(set (strict_low_part (match_operand:QI 0 "general_operand" "=r"))
  893.     (minus:QI (match_operand:QI 1 "general_operand" "0")
  894.           (match_operand:QI 2 "general_operand" "g")))]
  895.   ""
  896.   "*
  897. {
  898.   if (GET_CODE (operands[1]) == CONST_INT
  899.       && INTVAL (operands[1]) >-8 && INTVAL(operands[1]) < 9)
  900.     return \"addqb %$%n1,%0\";
  901.   return \"subb %1,%0\";
  902. }")
  903.  
  904. ;;- Multiply instructions.
  905.  
  906. (define_insn "muldf3"
  907.   [(set (match_operand:DF 0 "general_operand" "=fm")
  908.     (mult:DF (match_operand:DF 1 "general_operand" "%0")
  909.          (match_operand:DF 2 "general_operand" "fmF")))]
  910.   "TARGET_32081"
  911.   "mull %2,%0")
  912.  
  913. (define_insn "mulsf3"
  914.   [(set (match_operand:SF 0 "general_operand" "=fm")
  915.     (mult:SF (match_operand:SF 1 "general_operand" "%0")
  916.          (match_operand:SF 2 "general_operand" "fmF")))]
  917.   "TARGET_32081"
  918.   "mulf %2,%0")
  919.  
  920. (define_insn "mulsi3"
  921.   [(set (match_operand:SI 0 "general_operand" "=g")
  922.     (mult:SI (match_operand:SI 1 "general_operand" "%0")
  923.          (match_operand:SI 2 "general_operand" "rmn")))]
  924.   ""
  925.   "muld %2,%0")
  926.  
  927. (define_insn "mulhi3"
  928.   [(set (match_operand:HI 0 "general_operand" "=g")
  929.     (mult:HI (match_operand:HI 1 "general_operand" "%0")
  930.          (match_operand:HI 2 "general_operand" "g")))]
  931.   ""
  932.   "mulw %2,%0")
  933.  
  934. (define_insn "mulqi3"
  935.   [(set (match_operand:QI 0 "general_operand" "=g")
  936.     (mult:QI (match_operand:QI 1 "general_operand" "%0")
  937.          (match_operand:QI 2 "general_operand" "g")))]
  938.   ""
  939.   "mulb %2,%0")
  940.  
  941. (define_insn "umulsi3"
  942.   [(set (match_operand:SI 0 "general_operand" "=g")
  943.     (umult:SI (match_operand:SI 1 "general_operand" "%0")
  944.           (match_operand:SI 2 "general_operand" "rmn")))]
  945.   ""
  946.   "muld %2,%0")
  947.  
  948. (define_insn "umulhi3"
  949.   [(set (match_operand:HI 0 "general_operand" "=g")
  950.     (umult:HI (match_operand:HI 1 "general_operand" "%0")
  951.           (match_operand:HI 2 "general_operand" "g")))]
  952.   ""
  953.   "mulw %2,%0")
  954.  
  955. (define_insn "umulqi3"
  956.   [(set (match_operand:QI 0 "general_operand" "=g")
  957.     (umult:QI (match_operand:QI 1 "general_operand" "%0")
  958.           (match_operand:QI 2 "general_operand" "g")))]
  959.   ""
  960.   "mulb %2,%0")
  961.  
  962. (define_insn "umulsidi3"
  963.   [(set (match_operand:DI 0 "general_operand" "=g")
  964.     (umult:DI (match_operand:SI 1 "general_operand" "0")
  965.           (match_operand:SI 2 "general_operand" "rmn")))]
  966.   ""
  967.   "meid %2,%0")
  968.  
  969. ;;- Divide instructions.
  970.  
  971. (define_insn "divdf3"
  972.   [(set (match_operand:DF 0 "general_operand" "=fm")
  973.     (div:DF (match_operand:DF 1 "general_operand" "0")
  974.         (match_operand:DF 2 "general_operand" "fmF")))]
  975.   "TARGET_32081"
  976.   "divl %2,%0")
  977.  
  978. (define_insn "divsf3"
  979.   [(set (match_operand:SF 0 "general_operand" "=fm")
  980.     (div:SF (match_operand:SF 1 "general_operand" "0")
  981.         (match_operand:SF 2 "general_operand" "fmF")))]
  982.   "TARGET_32081"
  983.   "divf %2,%0")
  984.  
  985. (define_insn "divsi3"
  986.   [(set (match_operand:SI 0 "general_operand" "=g")
  987.     (div:SI (match_operand:SI 1 "general_operand" "0")
  988.         (match_operand:SI 2 "general_operand" "rmn")))]
  989.   ""
  990.   "quod %2,%0")
  991.  
  992. (define_insn "divhi3"
  993.   [(set (match_operand:HI 0 "general_operand" "=g")
  994.     (div:HI (match_operand:HI 1 "general_operand" "0")
  995.         (match_operand:HI 2 "general_operand" "g")))]
  996.   ""
  997.   "quow %2,%0")
  998.  
  999. (define_insn "divqi3"
  1000.   [(set (match_operand:QI 0 "general_operand" "=g")
  1001.     (div:QI (match_operand:QI 1 "general_operand" "0")
  1002.         (match_operand:QI 2 "general_operand" "g")))]
  1003.   ""
  1004.   "quob %2,%0")
  1005.  
  1006. (define_insn "udivsi3"
  1007.   [(set (match_operand:SI 0 "register_operand" "=r")
  1008.     (udiv:SI (subreg:SI (match_operand:DI 1 "reg_or_mem_operand" "0") 0)
  1009.          (match_operand:SI 2 "general_operand" "rmn")))]
  1010.   ""
  1011.   "*
  1012. {
  1013.   operands[1] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
  1014.   return \"deid %2,%0\;movd %1,%0\";
  1015. }")
  1016.  
  1017. (define_insn "udivhi3"
  1018.   [(set (match_operand:HI 0 "register_operand" "=r")
  1019.     (udiv:HI (subreg:HI (match_operand:DI 1 "reg_or_mem_operand" "0") 0)
  1020.          (match_operand:HI 2 "general_operand" "g")))]
  1021.   ""
  1022.   "*
  1023. {
  1024.   operands[1] = gen_rtx (REG, HImode, REGNO (operands[0]) + 1);
  1025.   return \"deiw %2,%0\;movw %1,%0\";
  1026. }")
  1027.  
  1028. (define_insn "udivqi3"
  1029.   [(set (match_operand:QI 0 "register_operand" "=r")
  1030.     (udiv:QI (subreg:QI (match_operand:DI 1 "reg_or_mem_operand" "0") 0)
  1031.          (match_operand:QI 2 "general_operand" "g")))]
  1032.   ""
  1033.   "*
  1034. {
  1035.   operands[1] = gen_rtx (REG, QImode, REGNO (operands[0]) + 1);
  1036.   return \"deib %2,%0\;movb %1,%0\";
  1037. }")
  1038.  
  1039. ;; Remainder instructions.
  1040.  
  1041. (define_insn "modsi3"
  1042.   [(set (match_operand:SI 0 "general_operand" "=g")
  1043.     (mod:SI (match_operand:SI 1 "general_operand" "0")
  1044.         (match_operand:SI 2 "general_operand" "rmn")))]
  1045.   ""
  1046.   "remd %2,%0")
  1047.  
  1048. (define_insn "modhi3"
  1049.   [(set (match_operand:HI 0 "general_operand" "=g")
  1050.     (mod:HI (match_operand:HI 1 "general_operand" "0")
  1051.         (match_operand:HI 2 "general_operand" "g")))]
  1052.   ""
  1053.   "remw %2,%0")
  1054.  
  1055. (define_insn "modqi3"
  1056.   [(set (match_operand:QI 0 "general_operand" "=g")
  1057.     (mod:QI (match_operand:QI 1 "general_operand" "0")
  1058.         (match_operand:QI 2 "general_operand" "g")))]
  1059.   ""
  1060.   "remb %2,%0")
  1061.  
  1062. (define_insn "umodsi3"
  1063.   [(set (match_operand:SI 0 "register_operand" "=r")
  1064.     (umod:SI (subreg:SI (match_operand:DI 1 "reg_or_mem_operand" "0") 0)
  1065.          (match_operand:SI 2 "general_operand" "rmn")))]
  1066.   ""
  1067.   "deid %2,%0")
  1068.  
  1069. (define_insn "umodhi3"
  1070.   [(set (match_operand:HI 0 "register_operand" "=r")
  1071.     (umod:HI (subreg:HI (match_operand:DI 1 "reg_or_mem_operand" "0") 0)
  1072.          (match_operand:HI 2 "general_operand" "g")))]
  1073.   ""
  1074.   "deiw %2,%0")
  1075.  
  1076. (define_insn "umodqi3"
  1077.   [(set (match_operand:QI 0 "register_operand" "=r")
  1078.     (umod:QI (subreg:QI (match_operand:DI 1 "reg_or_mem_operand" "0") 0)
  1079.          (match_operand:QI 2 "general_operand" "g")))]
  1080.   ""
  1081.   "deib %2,%0")
  1082.  
  1083. ; This isn't be usable in its current form.
  1084. ;(define_insn "udivmoddisi4"
  1085. ;  [(set (subreg:SI (match_operand:DI 0 "general_operand" "=r") 1)
  1086. ;    (udiv:SI (match_operand:DI 1 "general_operand" "0")
  1087. ;         (match_operand:SI 2 "general_operand" "rmn")))
  1088. ;   (set (subreg:SI (match_dup 0) 0)
  1089. ;    (umod:SI (match_dup 1) (match_dup 2)))]
  1090. ;  ""
  1091. ;  "deid %2,%0")
  1092.  
  1093. ;;- Logical Instructions: AND
  1094.  
  1095. (define_insn "andsi3"
  1096.   [(set (match_operand:SI 0 "general_operand" "=g")
  1097.     (and:SI (match_operand:SI 1 "general_operand" "%0")
  1098.         (match_operand:SI 2 "general_operand" "rmn")))]
  1099.   ""
  1100.   "*
  1101. {
  1102.   if (GET_CODE (operands[2]) == CONST_INT)
  1103.     {
  1104.       if ((INTVAL (operands[2]) | 0xff) == 0xffffffff)
  1105.     {
  1106.       if (INTVAL (operands[2]) == 0xffffff00)
  1107.         return \"movqb %$0,%0\";
  1108.       else
  1109.         {
  1110.           operands[2] = gen_rtx (CONST_INT, VOIDmode,
  1111.                      INTVAL (operands[2]) & 0xff);
  1112.           return \"andb %2,%0\";
  1113.         }
  1114.     }
  1115.       if ((INTVAL (operands[2]) | 0xffff) == 0xffffffff)
  1116.         {
  1117.       if (INTVAL (operands[2]) == 0xffff0000)
  1118.         return \"movqw %$0,%0\";
  1119.       else
  1120.         {
  1121.           operands[2] = gen_rtx (CONST_INT, VOIDmode,
  1122.                      INTVAL (operands[2]) & 0xffff);
  1123.           return \"andw %2,%0\";
  1124.         }
  1125.     }
  1126.     }
  1127.   return \"andd %2,%0\";
  1128. }")
  1129.  
  1130. (define_insn "andhi3"
  1131.   [(set (match_operand:HI 0 "general_operand" "=g")
  1132.     (and:HI (match_operand:HI 1 "general_operand" "%0")
  1133.         (match_operand:HI 2 "general_operand" "g")))]
  1134.   ""
  1135.   "*
  1136. {
  1137.   if (GET_CODE (operands[2]) == CONST_INT
  1138.       && (INTVAL (operands[2]) | 0xff) == 0xffffffff)
  1139.     {
  1140.       if (INTVAL (operands[2]) == 0xffffff00)
  1141.     return \"movqb %$0,%0\";
  1142.       else
  1143.     {
  1144.       operands[2] = gen_rtx (CONST_INT, VOIDmode,
  1145.                  INTVAL (operands[2]) & 0xff);
  1146.       return \"andb %2,%0\";
  1147.     }
  1148.     }
  1149.   return \"andw %2,%0\";
  1150. }")
  1151.  
  1152. (define_insn "andqi3"
  1153.   [(set (match_operand:QI 0 "general_operand" "=g")
  1154.     (and:QI (match_operand:QI 1 "general_operand" "%0")
  1155.         (match_operand:QI 2 "general_operand" "g")))]
  1156.   ""
  1157.   "andb %2,%0")
  1158.  
  1159. (define_insn "andcbsi3"
  1160.   [(set (match_operand:SI 0 "general_operand" "=g")
  1161.     (and:SI (match_operand:SI 1 "general_operand" "0")
  1162.         (not:SI (match_operand:SI 2 "general_operand" "rmn"))))]
  1163.   ""
  1164.   "*
  1165. {
  1166.   if (GET_CODE (operands[2]) == CONST_INT)
  1167.     {
  1168.       if ((INTVAL (operands[2]) & 0xffffff00) == 0)
  1169.     return \"bicb %2,%0\";
  1170.       if ((INTVAL (operands[2]) & 0xffff0000) == 0)
  1171.     return \"bicw %2,%0\";
  1172.     }
  1173.   return \"bicd %2,%0\";
  1174. }")
  1175.  
  1176. (define_insn ""
  1177.   [(set (match_operand:SI 0 "general_operand" "=g")
  1178.     (and:SI (not:SI (match_operand:SI 1 "general_operand" "rmn"))
  1179.         (match_operand:SI 2 "general_operand" "0")))]
  1180.   ""
  1181.   "*
  1182. {
  1183.   if (GET_CODE (operands[1]) == CONST_INT)
  1184.     {
  1185.       if ((INTVAL (operands[1]) & 0xffffff00) == 0)
  1186.     return \"bicb %1,%0\";
  1187.       if ((INTVAL (operands[1]) & 0xffff0000) == 0)
  1188.     return \"bicw %1,%0\";
  1189.     }
  1190.   return \"bicd %1,%0\";
  1191. }")
  1192.  
  1193. (define_insn "andcbhi3"
  1194.   [(set (match_operand:HI 0 "general_operand" "=g")
  1195.     (and:HI (match_operand:HI 1 "general_operand" "%0")
  1196.         (not:HI (match_operand:HI 2 "general_operand" "g"))))]
  1197.   ""
  1198.   "*
  1199. {
  1200.   if (GET_CODE (operands[2]) == CONST_INT
  1201.       && (INTVAL (operands[2]) & 0xffffff00) == 0)
  1202.     return \"bicb %2,%0\";
  1203.   return \"bicw %2,%0\";
  1204. }")
  1205.  
  1206. (define_insn ""
  1207.   [(set (match_operand:HI 0 "general_operand" "=g")
  1208.     (and:HI (not:HI (match_operand:HI 1 "general_operand" "g"))
  1209.         (match_operand:HI 2 "general_operand" "0")))]
  1210.   ""
  1211.   "*
  1212. {
  1213.   if (GET_CODE (operands[1]) == CONST_INT
  1214.       && (INTVAL (operands[1]) & 0xffffff00) == 0)
  1215.     return \"bicb %1,%0\";
  1216.   return \"bicw %1,%0\";
  1217. }")
  1218.  
  1219. (define_insn "andcbqi3"
  1220.   [(set (match_operand:QI 0 "general_operand" "=g")
  1221.     (and:QI (match_operand:QI 1 "general_operand" "%0")
  1222.         (not:QI (match_operand:QI 2 "general_operand" "g"))))]
  1223.   ""
  1224.   "bicb %2,%0")
  1225.  
  1226. (define_insn ""
  1227.   [(set (match_operand:QI 0 "general_operand" "=g")
  1228.     (and:QI (not:QI (match_operand:QI 1 "general_operand" "g"))
  1229.         (match_operand:QI 2 "general_operand" "0")))]
  1230.   ""
  1231.   "bicb %1,%0")
  1232.  
  1233. ;;- Bit set instructions.
  1234.  
  1235. (define_insn "iorsi3"
  1236.   [(set (match_operand:SI 0 "general_operand" "=g")
  1237.     (ior:SI (match_operand:SI 1 "general_operand" "%0")
  1238.         (match_operand:SI 2 "general_operand" "rmn")))]
  1239.   ""
  1240.   "*
  1241. {
  1242.   if (GET_CODE (operands[2]) == CONST_INT) {
  1243.     if ((INTVAL (operands[2]) & 0xffffff00) == 0)
  1244.       return \"orb %2,%0\";
  1245.     if ((INTVAL (operands[2]) & 0xffff0000) == 0)
  1246.       return \"orw %2,%0\";
  1247.   }
  1248.   return \"ord %2,%0\";
  1249. }")
  1250.  
  1251. (define_insn "iorhi3"
  1252.   [(set (match_operand:HI 0 "general_operand" "=g")
  1253.     (ior:HI (match_operand:HI 1 "general_operand" "%0")
  1254.         (match_operand:HI 2 "general_operand" "g")))]
  1255.   ""
  1256.   "*
  1257. {
  1258.   if (GET_CODE(operands[2]) == CONST_INT &&
  1259.       (INTVAL(operands[2]) & 0xffffff00) == 0)
  1260.     return \"orb %2,%0\";
  1261.   return \"orw %2,%0\";
  1262. }")
  1263.  
  1264. (define_insn "iorqi3"
  1265.   [(set (match_operand:QI 0 "general_operand" "=g")
  1266.     (ior:QI (match_operand:QI 1 "general_operand" "%0")
  1267.         (match_operand:QI 2 "general_operand" "g")))]
  1268.   ""
  1269.   "orb %2,%0")
  1270.  
  1271. ;;- xor instructions.
  1272.  
  1273. (define_insn "xorsi3"
  1274.   [(set (match_operand:SI 0 "general_operand" "=g")
  1275.     (xor:SI (match_operand:SI 1 "general_operand" "%0")
  1276.         (match_operand:SI 2 "general_operand" "rmn")))]
  1277.   ""
  1278.   "*
  1279. {
  1280.   if (GET_CODE (operands[2]) == CONST_INT) {
  1281.     if ((INTVAL (operands[2]) & 0xffffff00) == 0)
  1282.       return \"xorb %2,%0\";
  1283.     if ((INTVAL (operands[2]) & 0xffff0000) == 0)
  1284.       return \"xorw %2,%0\";
  1285.   }
  1286.   return \"xord %2,%0\";
  1287. }")
  1288.  
  1289. (define_insn "xorhi3"
  1290.   [(set (match_operand:HI 0 "general_operand" "=g")
  1291.     (xor:HI (match_operand:HI 1 "general_operand" "%0")
  1292.         (match_operand:HI 2 "general_operand" "g")))]
  1293.   ""
  1294.   "*
  1295. {
  1296.   if (GET_CODE(operands[2]) == CONST_INT &&
  1297.       (INTVAL(operands[2]) & 0xffffff00) == 0)
  1298.     return \"xorb %2,%0\";
  1299.   return \"xorw %2,%0\";
  1300. }")
  1301.  
  1302. (define_insn "xorqi3"
  1303.   [(set (match_operand:QI 0 "general_operand" "=g")
  1304.     (xor:QI (match_operand:QI 1 "general_operand" "%0")
  1305.         (match_operand:QI 2 "general_operand" "g")))]
  1306.   ""
  1307.   "xorb %2,%0")
  1308.  
  1309. (define_insn "negdf2"
  1310.   [(set (match_operand:DF 0 "general_operand" "=fm<")
  1311.     (neg:DF (match_operand:DF 1 "general_operand" "fmF")))]
  1312.   "TARGET_32081"
  1313.   "negl %1,%0")
  1314.  
  1315. (define_insn "negsf2"
  1316.   [(set (match_operand:SF 0 "general_operand" "=fm<")
  1317.     (neg:SF (match_operand:SF 1 "general_operand" "fmF")))]
  1318.   "TARGET_32081"
  1319.   "negf %1,%0")
  1320.  
  1321. (define_insn "negsi2"
  1322.   [(set (match_operand:SI 0 "general_operand" "=g<")
  1323.     (neg:SI (match_operand:SI 1 "general_operand" "rmn")))]
  1324.   ""
  1325.   "negd %1,%0")
  1326.  
  1327. (define_insn "neghi2"
  1328.   [(set (match_operand:HI 0 "general_operand" "=g<")
  1329.     (neg:HI (match_operand:HI 1 "general_operand" "g")))]
  1330.   ""
  1331.   "negw %1,%0")
  1332.  
  1333. (define_insn "negqi2"
  1334.   [(set (match_operand:QI 0 "general_operand" "=g<")
  1335.     (neg:QI (match_operand:QI 1 "general_operand" "g")))]
  1336.   ""
  1337.   "negb %1,%0")
  1338.  
  1339. (define_insn "one_cmplsi2"
  1340.   [(set (match_operand:SI 0 "general_operand" "=g<")
  1341.     (not:SI (match_operand:SI 1 "general_operand" "rmn")))]
  1342.   ""
  1343.   "comd %1,%0")
  1344.  
  1345. (define_insn "one_cmplhi2"
  1346.   [(set (match_operand:HI 0 "general_operand" "=g<")
  1347.     (not:HI (match_operand:HI 1 "general_operand" "g")))]
  1348.   ""
  1349.   "comw %1,%0")
  1350.  
  1351. (define_insn "one_cmplqi2"
  1352.   [(set (match_operand:QI 0 "general_operand" "=g<")
  1353.     (not:QI (match_operand:QI 1 "general_operand" "g")))]
  1354.   ""
  1355.   "comb %1,%0")
  1356.  
  1357. ;; arithmetic left and right shift operations
  1358.  
  1359. (define_insn "ashlsi3"
  1360.   [(set (match_operand:SI 0 "general_operand" "=g,g")
  1361.     (ashift:SI (match_operand:SI 1 "general_operand" "r,0")
  1362.            (match_operand:SI 2 "general_operand" "I,rmn")))]
  1363.   ""
  1364.   "* output_shift_insn (operands);")
  1365.  
  1366. (define_insn "ashlhi3"
  1367.   [(set (match_operand:HI 0 "general_operand" "=g")
  1368.     (ashift:HI (match_operand:HI 1 "general_operand" "0")
  1369.            (match_operand:SI 2 "general_operand" "rmn")))]
  1370.   ""
  1371.   "*
  1372. { if (GET_CODE (operands[2]) == CONST_INT)
  1373.     if (INTVAL (operands[2]) == 1)
  1374.       return \"addw %1,%0\";
  1375.     else if (INTVAL (operands[2]) == 2)
  1376.       return \"addw %1,%0\;addw %0,%0\";
  1377.   return \"ashw %2,%0\";
  1378. }")
  1379.  
  1380. (define_insn "ashlqi3"
  1381.   [(set (match_operand:QI 0 "general_operand" "=g")
  1382.     (ashift:QI (match_operand:QI 1 "general_operand" "0")
  1383.            (match_operand:SI 2 "general_operand" "rmn")))]
  1384.   ""
  1385.   "*
  1386. { if (GET_CODE (operands[2]) == CONST_INT)
  1387.     if (INTVAL (operands[2]) == 1)
  1388.       return \"addb %1,%0\";
  1389.     else if (INTVAL (operands[2]) == 2)
  1390.       return \"addb %1,%0\;addb %0,%0\";
  1391.   return \"ashb %2,%0\";
  1392. }")
  1393.  
  1394. ;; Arithmetic right shift on the 32k works by negating the shift count.
  1395. (define_expand "ashrsi3"
  1396.   [(set (match_operand:SI 0 "general_operand" "=g")
  1397.     (ashift:SI (match_operand:SI 1 "general_operand" "g")
  1398.            (match_operand:SI 2 "general_operand" "g")))]
  1399.   ""
  1400.   "
  1401. {
  1402.   operands[2] = negate_rtx (SImode, operands[2]);
  1403. }")
  1404.  
  1405. (define_expand "ashrhi3"
  1406.   [(set (match_operand:HI 0 "general_operand" "=g")
  1407.     (ashift:HI (match_operand:HI 1 "general_operand" "g")
  1408.            (match_operand:SI 2 "general_operand" "g")))]
  1409.   ""
  1410.   "
  1411. {
  1412.   operands[2] = negate_rtx (SImode, operands[2]);
  1413. }")
  1414.  
  1415. (define_expand "ashrqi3"
  1416.   [(set (match_operand:QI 0 "general_operand" "=g")
  1417.     (ashift:QI (match_operand:QI 1 "general_operand" "g")
  1418.            (match_operand:SI 2 "general_operand" "g")))]
  1419.   ""
  1420.   "
  1421. {
  1422.   operands[2] = negate_rtx (SImode, operands[2]);
  1423. }")
  1424.  
  1425. ;; logical shift instructions
  1426.  
  1427. (define_insn "lshlsi3"
  1428.   [(set (match_operand:SI 0 "general_operand" "=g")
  1429.     (lshift:SI (match_operand:SI 1 "general_operand" "0")
  1430.            (match_operand:SI 2 "general_operand" "rmn")))]
  1431.   ""
  1432.   "lshd %2,%0")
  1433.  
  1434. (define_insn "lshlhi3"
  1435.   [(set (match_operand:HI 0 "general_operand" "=g")
  1436.     (lshift:HI (match_operand:HI 1 "general_operand" "0")
  1437.            (match_operand:SI 2 "general_operand" "rmn")))]
  1438.   ""
  1439.   "lshw %2,%0")
  1440.  
  1441. (define_insn "lshlqi3"
  1442.   [(set (match_operand:QI 0 "general_operand" "=g")
  1443.     (lshift:QI (match_operand:QI 1 "general_operand" "0")
  1444.            (match_operand:SI 2 "general_operand" "rmn")))]
  1445.   ""
  1446.   "lshb %2,%0")
  1447.  
  1448. ;; Logical right shift on the 32k works by negating the shift count.
  1449. (define_expand "lshrsi3"
  1450.   [(set (match_operand:SI 0 "general_operand" "=g")
  1451.     (lshift:SI (match_operand:SI 1 "general_operand" "g")
  1452.            (match_operand:SI 2 "general_operand" "g")))]
  1453.   ""
  1454.   "
  1455. {
  1456.   operands[2] = negate_rtx (SImode, operands[2]);
  1457. }")
  1458.  
  1459. (define_expand "lshrhi3"
  1460.   [(set (match_operand:HI 0 "general_operand" "=g")
  1461.     (lshift:HI (match_operand:HI 1 "general_operand" "g")
  1462.            (match_operand:SI 2 "general_operand" "g")))]
  1463.   ""
  1464.   "
  1465. {
  1466.   operands[2] = negate_rtx (SImode, operands[2]);
  1467. }")
  1468.  
  1469. (define_expand "lshrqi3"
  1470.   [(set (match_operand:QI 0 "general_operand" "=g")
  1471.     (lshift:QI (match_operand:QI 1 "general_operand" "g")
  1472.            (match_operand:SI 2 "general_operand" "g")))]
  1473.   ""
  1474.   "
  1475. {
  1476.   operands[2] = negate_rtx (SImode, operands[2]);
  1477. }")
  1478.  
  1479. ;; Rotate instructions
  1480.  
  1481. (define_insn "rotlsi3"
  1482.   [(set (match_operand:SI 0 "general_operand" "=g")
  1483.     (rotate:SI (match_operand:SI 1 "general_operand" "0")
  1484.            (match_operand:SI 2 "general_operand" "rmn")))]
  1485.   ""
  1486.   "rotd %2,%0")
  1487.  
  1488. (define_insn "rotlhi3"
  1489.   [(set (match_operand:HI 0 "general_operand" "=g")
  1490.     (rotate:HI (match_operand:HI 1 "general_operand" "0")
  1491.            (match_operand:SI 2 "general_operand" "rmn")))]
  1492.   ""
  1493.   "rotw %2,%0")
  1494.  
  1495. (define_insn "rotlqi3"
  1496.   [(set (match_operand:QI 0 "general_operand" "=g")
  1497.     (rotate:QI (match_operand:QI 1 "general_operand" "0")
  1498.            (match_operand:SI 2 "general_operand" "rmn")))]
  1499.   ""
  1500.   "rotb %2,%0")
  1501.  
  1502. ;; Right rotate on the 32k works by negating the shift count.
  1503. (define_expand "rotrsi3"
  1504.   [(set (match_operand:SI 0 "general_operand" "=g")
  1505.     (rotate:SI (match_operand:SI 1 "general_operand" "g")
  1506.            (match_operand:SI 2 "general_operand" "g")))]
  1507.   ""
  1508.   "
  1509. {
  1510.   operands[2] = negate_rtx (SImode, operands[2]);
  1511. }")
  1512.  
  1513. (define_expand "rotrhi3"
  1514.   [(set (match_operand:HI 0 "general_operand" "=g")
  1515.     (rotate:HI (match_operand:HI 1 "general_operand" "g")
  1516.            (match_operand:SI 2 "general_operand" "g")))]
  1517.   ""
  1518.   "
  1519. {
  1520.   operands[2] = negate_rtx (SImode, operands[2]);
  1521. }")
  1522.  
  1523. (define_expand "rotrqi3"
  1524.   [(set (match_operand:QI 0 "general_operand" "=g")
  1525.     (rotate:QI (match_operand:QI 1 "general_operand" "g")
  1526.            (match_operand:SI 2 "general_operand" "g")))]
  1527.   ""
  1528.   "
  1529. {
  1530.   operands[2] = negate_rtx (SImode, operands[2]);
  1531. }")
  1532.  
  1533. ;;- load or push effective address 
  1534. ;; These come after the move, add, and multiply patterns
  1535. ;; because we don't want pushl $1 turned into pushad 1.
  1536.  
  1537. (define_insn ""
  1538.   [(set (match_operand:SI 0 "general_operand" "=g<")
  1539.     (match_operand:QI 1 "address_operand" "p"))]
  1540.   ""
  1541.   "*
  1542. {
  1543.   if (REG_P (operands[0])
  1544.       && GET_CODE (operands[1]) == MULT
  1545.       && GET_CODE (XEXP (operands[1], 1)) == CONST_INT
  1546.       && (INTVAL (XEXP (operands[1], 1)) == 2
  1547.       || INTVAL (XEXP (operands[1], 1)) == 4))
  1548.     {
  1549.       rtx xoperands[3];
  1550.       xoperands[0] = operands[0];
  1551.       xoperands[1] = XEXP (operands[1], 0);
  1552.       xoperands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (XEXP (operands[1], 1)) >> 1);
  1553.       return output_shift_insn (xoperands);
  1554.     }
  1555.   return \"addr %a1,%0\";
  1556. }")
  1557.  
  1558. ;;; Index insns.  These are about the same speed as multiply-add counterparts.
  1559. ;;; but slower then using power-of-2 shifts if we can use them
  1560. ;
  1561. ;(define_insn ""
  1562. ;  [(set (match_operand:SI 0 "register_operand" "=r")
  1563. ;    (plus:SI (match_operand:SI 1 "general_operand" "rmn")
  1564. ;         (mult:SI (match_operand:SI 2 "register_operand" "0")
  1565. ;              (plus:SI (match_operand:SI 3 "general_operand" "rmn") (const_int 1)))))]
  1566. ;  "GET_CODE (operands[3]) != CONST_INT || INTVAL (operands[3]) > 8"
  1567. ;  "indexd %0,%3,%1")
  1568. ;
  1569. ;(define_insn ""
  1570. ;  [(set (match_operand:SI 0 "register_operand" "=r")
  1571. ;    (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "0")
  1572. ;              (plus:SI (match_operand:SI 2 "general_operand" "rmn") (const_int 1)))
  1573. ;         (match_operand:SI 3 "general_operand" "rmn")))]
  1574. ;  "GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) > 8"
  1575. ;  "indexd %0,%2,%3")
  1576.  
  1577. ;; Set, Clear, and Invert bit
  1578.  
  1579. (define_insn ""
  1580.   [(set (match_operand:SI 0 "general_operand" "=g")
  1581.     (ior:SI
  1582.      (ashift:SI (const_int 1)
  1583.             (match_operand:SI 1 "general_operand" "rmn"))
  1584.      (match_dup 0)))]
  1585.   ""
  1586.   "sbitd %1,%0")
  1587.  
  1588. (define_insn ""
  1589.   [(set (match_operand:SI 0 "general_operand" "=g")
  1590.     (ior:SI
  1591.      (match_dup 0)
  1592.      (ashift:SI (const_int 1)
  1593.             (match_operand:SI 1 "general_operand" "rmn"))))]
  1594.   ""
  1595.   "sbitd %1,%0")
  1596.  
  1597. (define_insn ""
  1598.   [(set (match_operand:QI 0 "general_operand" "=g")
  1599.     (ior:QI
  1600.      (subreg:QI
  1601.       (ashift:SI (const_int 1)
  1602.              (match_operand:QI 1 "general_operand" "rmn")) 0)
  1603.      (match_dup 0)))]
  1604.   ""
  1605.   "sbitb %1,%0")
  1606.  
  1607. (define_insn ""
  1608.   [(set (match_operand:QI 0 "general_operand" "=g")
  1609.     (ior:QI
  1610.      (match_dup 0)
  1611.      (subreg:QI
  1612.       (ashift:SI (const_int 1)
  1613.              (match_operand:QI 1 "general_operand" "rmn")) 0)))]
  1614.   ""
  1615.   "sbitb %1,%0")
  1616.  
  1617. (define_insn ""
  1618.   [(set (match_operand:SI 0 "general_operand" "=g")
  1619.     (and:SI
  1620.      (not:SI
  1621.       (ashift:SI (const_int 1)
  1622.              (match_operand:SI 1 "general_operand" "rmn")))
  1623.      (match_dup 0)))]
  1624.   ""
  1625.   "cbitd %1,%0")
  1626.  
  1627. (define_insn ""
  1628.   [(set (match_operand:SI 0 "general_operand" "=g")
  1629.     (and:SI
  1630.      (match_dup 0)
  1631.      (not:SI
  1632.       (ashift:SI (const_int 1)
  1633.              (match_operand:SI 1 "general_operand" "rmn")))))]
  1634.   ""
  1635.   "cbitd %1,%0")
  1636.  
  1637. (define_insn ""
  1638.   [(set (match_operand:QI 0 "general_operand" "=g")
  1639.     (and:QI
  1640.      (subreg:QI
  1641.       (not:SI
  1642.        (ashift:SI (const_int 1)
  1643.               (match_operand:QI 1 "general_operand" "rmn"))) 0)
  1644.      (match_dup 0)))]
  1645.   ""
  1646.   "cbitb %1,%0")
  1647.  
  1648. (define_insn ""
  1649.   [(set (match_operand:QI 0 "general_operand" "=g")
  1650.     (and:QI
  1651.      (match_dup 0)
  1652.      (subreg:QI
  1653.       (not:SI
  1654.        (ashift:SI (const_int 1)
  1655.               (match_operand:QI 1 "general_operand" "rmn"))) 0)))]
  1656.   ""
  1657.   "cbitb %1,%0")
  1658.  
  1659. (define_insn ""
  1660.   [(set (match_operand:SI 0 "general_operand" "=g")
  1661.     (xor:SI
  1662.      (ashift:SI (const_int 1)
  1663.             (match_operand:SI 1 "general_operand" "rmn"))
  1664.      (match_dup 0)))]
  1665.   ""
  1666.   "ibitd %1,%0")
  1667.  
  1668. (define_insn ""
  1669.   [(set (match_operand:SI 0 "general_operand" "=g")
  1670.     (xor:SI
  1671.      (match_dup 0)
  1672.      (ashift:SI (const_int 1)
  1673.             (match_operand:SI 1 "general_operand" "rmn"))))]
  1674.   ""
  1675.   "ibitd %1,%0")
  1676.  
  1677. (define_insn ""
  1678.   [(set (match_operand:QI 0 "general_operand" "=g")
  1679.     (xor:QI
  1680.      (subreg:QI
  1681.       (ashift:SI (const_int 1)
  1682.              (match_operand:QI 1 "general_operand" "rmn")) 0)
  1683.      (match_dup 0)))]
  1684.   ""
  1685.   "ibitb %1,%0")
  1686.  
  1687. (define_insn ""
  1688.   [(set (match_operand:QI 0 "general_operand" "=g")
  1689.     (xor:QI
  1690.      (match_dup 0)
  1691.      (subreg:QI
  1692.       (ashift:SI (const_int 1)
  1693.              (match_operand:QI 1 "general_operand" "rmn")) 0)))]
  1694.   ""
  1695.   "ibitb %1,%0")
  1696.  
  1697. ;; Recognize jbs and jbc instructions.
  1698.  
  1699. (define_insn ""
  1700.   [(set (cc0)
  1701.     (zero_extract (match_operand:SI 0 "general_operand" "rm")
  1702.               (const_int 1)
  1703.               (match_operand:SI 1 "general_operand" "rmn")))]
  1704.   ""
  1705.   "*
  1706. { cc_status.flags = CC_Z_IN_F;
  1707.   return \"tbitd %1,%0\";
  1708. }")
  1709.  
  1710. (define_insn ""
  1711.   [(set (cc0)
  1712.     (compare (zero_extract (match_operand:SI 0 "general_operand" "rm")
  1713.                    (const_int 1)
  1714.                    (match_operand:SI 1 "general_operand" "rmn"))
  1715.          (const_int 1)))]
  1716.   ""
  1717.   "*
  1718. { cc_status.flags = CC_Z_IN_NOT_F;
  1719.   return \"tbitd %1,%0\";
  1720. }")
  1721.  
  1722. (define_insn ""
  1723.   [(set (cc0)
  1724.     (zero_extract (match_operand:HI 0 "general_operand" "g")
  1725.               (const_int 1)
  1726.               (match_operand:HI 1 "general_operand" "g")))]
  1727.   ""
  1728.   "*
  1729. { cc_status.flags = CC_Z_IN_F;
  1730.   return \"tbitw %1,%0\";
  1731. }")
  1732.  
  1733. (define_insn ""
  1734.   [(set (cc0)
  1735.     (compare (zero_extract (match_operand:HI 0 "general_operand" "g")
  1736.                    (const_int 1)
  1737.                    (match_operand:HI 1 "general_operand" "rmn"))
  1738.          (const_int 1)))]
  1739.   ""
  1740.   "*
  1741. { cc_status.flags = CC_Z_IN_NOT_F;
  1742.   return \"tbitw %1,%0\";
  1743. }")
  1744.  
  1745. (define_insn ""
  1746.   [(set (cc0)
  1747.     (zero_extract (match_operand:QI 0 "general_operand" "g")
  1748.               (const_int 1)
  1749.               (match_operand:QI 1 "general_operand" "g")))]
  1750.   ""
  1751.   "*
  1752. { cc_status.flags = CC_Z_IN_F;
  1753.   return \"tbitb %1,%0\";
  1754. }")
  1755.  
  1756. (define_insn ""
  1757.   [(set (cc0)
  1758.     (compare (zero_extract:SI (match_operand:QI 0 "general_operand" "g")
  1759.                   (const_int 1)
  1760.                   (match_operand:QI 1 "general_operand" "rmn"))
  1761.          (const_int 1)))]
  1762.   ""
  1763.   "*
  1764. { cc_status.flags = CC_Z_IN_NOT_F;
  1765.   return \"tbitb %1,%0\";
  1766. }")
  1767.  
  1768. (define_insn ""
  1769.   [(set (cc0)
  1770.     (and:SI (match_operand:SI 0 "general_operand" "rm")
  1771.         (match_operand:SI 1 "immediate_operand" "i")))]
  1772.   "GET_CODE (operands[1]) == CONST_INT
  1773.    && exact_log2 (INTVAL (operands[1])) >= 0"
  1774.   "*
  1775. {
  1776.   operands[1]
  1777.     = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1])));
  1778.   cc_status.flags = CC_Z_IN_F;
  1779.   return \"tbitd %1,%0\";
  1780. }")
  1781.  
  1782. ;; extract(base, width, offset)
  1783. ;; Signed bitfield extraction is not supported in hardware on the
  1784. ;; NS 32032.  It is therefore better to let GCC figure out a
  1785. ;; good strategy for generating the proper instruction sequence
  1786. ;; and represent it as rtl.
  1787.  
  1788. ;; Optimize the case of extracting a byte or word from a register.
  1789. ;; Otherwise we must load a register with the offset of the
  1790. ;; chunk we want, and perform an extract insn (each of which
  1791. ;; is very expensive).  Since we use the stack to do our bit-twiddling
  1792. ;; we cannot use it for a destination.  Perhaps things are fast
  1793. ;; enough on the 32532 that such hacks are not needed.
  1794.  
  1795. (define_insn ""
  1796.   [(set (match_operand:SI 0 "general_operand" "=ro")
  1797.     (zero_extract:SI (match_operand:SI 1 "register_operand" "r")
  1798.              (match_operand:SI 2 "const_int" "i")
  1799.              (match_operand:SI 3 "const_int" "i")))]
  1800.   "(INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16)
  1801.    && (INTVAL (operands[3]) == 8 || INTVAL (operands[3]) == 16 || INTVAL (operands[3]) == 24)"
  1802.   "*
  1803. {
  1804.   output_asm_insn (\"movd %1,tos\", operands);
  1805.   if (INTVAL (operands[2]) == 16)
  1806.     {
  1807.       if (INTVAL (operands[3]) == 8)
  1808.     output_asm_insn (\"movzwd 1(sp),%0\", operands);
  1809.       else
  1810.     output_asm_insn (\"movzwd 2(sp),%0\", operands);
  1811.     }
  1812.   else
  1813.     {
  1814.       if (INTVAL (operands[3]) == 8)
  1815.     output_asm_insn (\"movzbd 1(sp),%0\", operands);
  1816.       else if (INTVAL (operands[3]) == 16)
  1817.     output_asm_insn (\"movzbd 2(sp),%0\", operands);
  1818.       else
  1819.     output_asm_insn (\"movzbd 3(sp),%0\", operands);
  1820.     }
  1821.   return \"cmpqd %$0,tos # adjsp -4\";
  1822. }")
  1823.  
  1824. (define_insn ""
  1825.   [(set (match_operand:SI 0 "general_operand" "=ro")
  1826.     (zero_extract:SI (match_operand:HI 1 "register_operand" "r")
  1827.              (match_operand:SI 2 "const_int" "i")
  1828.              (match_operand:SI 3 "const_int" "i")))]
  1829.   "INTVAL (operands[2]) == 8 && INTVAL (operands[3]) == 8"
  1830.   "movw %1,tos\;movzbd 1(sp),%0\;adjspb %$-2")
  1831.  
  1832. (define_insn "extzv"
  1833.   [(set (match_operand:SI 0 "general_operand" "=g<,g<")
  1834.     (zero_extract:SI (match_operand:SI 1 "general_operand" "rm,o")
  1835.              (match_operand:SI 2 "const_int" "i,i")
  1836.              (match_operand:SI 3 "general_operand" "rK,n")))]
  1837.   ""
  1838.   "*
  1839. { if (GET_CODE (operands[3]) == CONST_INT)
  1840.     {
  1841.       if (INTVAL (operands[3]) >= 8)
  1842.     operands[1] = adj_offsettable_operand (operands[1],
  1843.                            INTVAL (operands[3]) >> 3);
  1844.       return \"extsd %1,%0,%3,%2\";
  1845.     }
  1846.   else return \"extd %3,%1,%0,%2\";
  1847. }")
  1848.  
  1849. (define_insn ""
  1850.   [(set (match_operand:SI 0 "general_operand" "=g<,g<")
  1851.     (zero_extract:SI (match_operand:HI 1 "general_operand" "rm,o")
  1852.              (match_operand:SI 2 "const_int" "i,i")
  1853.              (match_operand:SI 3 "general_operand" "rK,n")))]
  1854.   ""
  1855.   "*
  1856. { if (GET_CODE (operands[3]) == CONST_INT)
  1857.     {
  1858.       if (INTVAL (operands[3]) >= 8)
  1859.     operands[1] = adj_offsettable_operand (operands[1],
  1860.                            INTVAL (operands[3]) >> 3);
  1861.       return \"extsd %1,%0,%3,%2\";
  1862.     }
  1863.   else return \"extd %3,%1,%0,%2\";
  1864. }")
  1865.  
  1866. (define_insn ""
  1867.   [(set (match_operand:SI 0 "general_operand" "=g<")
  1868.     (zero_extract:SI (match_operand:QI 1 "general_operand" "g")
  1869.              (match_operand:SI 2 "const_int" "i")
  1870.              (match_operand:SI 3 "general_operand" "rn")))]
  1871.   ""
  1872.   "*
  1873. { if (GET_CODE (operands[3]) == CONST_INT)
  1874.     return \"extsd %1,%0,%3,%2\";
  1875.   else return \"extd %3,%1,%0,%2\";
  1876. }")
  1877.  
  1878. (define_insn "insv"
  1879.   [(set (zero_extract:SI (match_operand:SI 0 "general_operand" "+g,o")
  1880.              (match_operand:SI 1 "const_int" "i,i")
  1881.              (match_operand:SI 2 "general_operand" "rK,n"))
  1882.     (match_operand:SI 3 "general_operand" "rm,rm"))]
  1883.   ""
  1884.   "*
  1885. { if (GET_CODE (operands[2]) == CONST_INT)
  1886.     {
  1887.       if (GET_CODE (operands[0]) == MEM && INTVAL (operands[2]) >= 8)
  1888.     {
  1889.       operands[0] = adj_offsettable_operand (operands[0],
  1890.                             INTVAL (operands[2]) / 8);
  1891.           operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) % 8);
  1892.     }
  1893.       if (INTVAL (operands[1]) <= 8)
  1894.     return \"inssb %3,%0,%2,%1\";
  1895.       else if (INTVAL (operands[1]) <= 16)
  1896.     return \"inssw %3,%0,%2,%1\";
  1897.       else
  1898.     return \"inssd %3,%0,%2,%1\";
  1899.     }
  1900.   return \"insd %2,%3,%0,%1\";
  1901. }")
  1902.  
  1903. (define_insn ""
  1904.   [(set (zero_extract:SI (match_operand:HI 0 "general_operand" "+g,o")
  1905.              (match_operand:SI 1 "const_int" "i,i")
  1906.              (match_operand:SI 2 "general_operand" "rK,n"))
  1907.     (match_operand:SI 3 "general_operand" "rm,rm"))]
  1908.   ""
  1909.   "*
  1910. { if (GET_CODE (operands[2]) == CONST_INT)
  1911.     {
  1912.       if (GET_CODE (operands[0]) == MEM && INTVAL (operands[2]) >= 8)
  1913.     {
  1914.       operands[0] = adj_offsettable_operand (operands[0],
  1915.                              INTVAL (operands[2]) / 8);
  1916.           operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) % 8);
  1917.     }
  1918.       if (INTVAL (operands[1]) <= 8)
  1919.     return \"inssb %3,%0,%2,%1\";
  1920.       else if (INTVAL (operands[1]) <= 16)
  1921.     return \"inssw %3,%0,%2,%1\";
  1922.       else
  1923.     return \"inssd %3,%0,%2,%1\";
  1924.     }
  1925.   return \"insd %2,%3,%0,%1\";
  1926. }")
  1927.  
  1928. (define_insn ""
  1929.   [(set (zero_extract:SI (match_operand:QI 0 "general_operand" "=g")
  1930.              (match_operand:SI 1 "const_int" "i")
  1931.              (match_operand:SI 2 "general_operand" "rn"))
  1932.     (match_operand:SI 3 "general_operand" "rm"))]
  1933.   ""
  1934.   "*
  1935. { if (GET_CODE (operands[2]) == CONST_INT)
  1936.     if (INTVAL (operands[1]) <= 8)
  1937.       return \"inssb %3,%0,%2,%1\";
  1938.     else if (INTVAL (operands[1]) <= 16)
  1939.       return \"inssw %3,%0,%2,%1\";
  1940.     else
  1941.       return \"inssd %3,%0,%2,%1\";
  1942.   return \"insd %2,%3,%0,%1\";
  1943. }")
  1944.  
  1945.  
  1946. (define_insn "jump"
  1947.   [(set (pc)
  1948.     (label_ref (match_operand 0 "" "")))]
  1949.   ""
  1950.   "br %l0")
  1951.  
  1952. (define_insn "beq"
  1953.   [(set (pc)
  1954.     (if_then_else (eq (cc0)
  1955.               (const_int 0))
  1956.               (label_ref (match_operand 0 "" ""))
  1957.               (pc)))]
  1958.   ""
  1959.   "*
  1960. { if (cc_prev_status.flags & CC_Z_IN_F)
  1961.     return \"bfc %l0\";
  1962.   else if (cc_prev_status.flags & CC_Z_IN_NOT_F)
  1963.     return \"bfs %l0\";
  1964.   else return \"beq %l0\";
  1965. }")
  1966.  
  1967. (define_insn "bne"
  1968.   [(set (pc)
  1969.     (if_then_else (ne (cc0)
  1970.               (const_int 0))
  1971.               (label_ref (match_operand 0 "" ""))
  1972.               (pc)))]
  1973.   ""
  1974.   "*
  1975. { if (cc_prev_status.flags & CC_Z_IN_F)
  1976.     return \"bfs %l0\";
  1977.   else if (cc_prev_status.flags & CC_Z_IN_NOT_F)
  1978.     return \"bfc %l0\";
  1979.   else return \"bne %l0\";
  1980. }")
  1981.  
  1982. (define_insn "bgt"
  1983.   [(set (pc)
  1984.     (if_then_else (gt (cc0)
  1985.               (const_int 0))
  1986.               (label_ref (match_operand 0 "" ""))
  1987.               (pc)))]
  1988.   ""
  1989.   "bgt %l0")
  1990.  
  1991. (define_insn "bgtu"
  1992.   [(set (pc)
  1993.     (if_then_else (gtu (cc0)
  1994.                (const_int 0))
  1995.               (label_ref (match_operand 0 "" ""))
  1996.               (pc)))]
  1997.   ""
  1998.   "bhi %l0")
  1999.  
  2000. (define_insn "blt"
  2001.   [(set (pc)
  2002.     (if_then_else (lt (cc0)
  2003.               (const_int 0))
  2004.               (label_ref (match_operand 0 "" ""))
  2005.               (pc)))]
  2006.   ""
  2007.   "blt %l0")
  2008.  
  2009. (define_insn "bltu"
  2010.   [(set (pc)
  2011.     (if_then_else (ltu (cc0)
  2012.                (const_int 0))
  2013.               (label_ref (match_operand 0 "" ""))
  2014.               (pc)))]
  2015.   ""
  2016.   "blo %l0")
  2017.  
  2018. (define_insn "bge"
  2019.   [(set (pc)
  2020.     (if_then_else (ge (cc0)
  2021.               (const_int 0))
  2022.               (label_ref (match_operand 0 "" ""))
  2023.               (pc)))]
  2024.   ""
  2025.   "bge %l0")
  2026.  
  2027. (define_insn "bgeu"
  2028.   [(set (pc)
  2029.     (if_then_else (geu (cc0)
  2030.                (const_int 0))
  2031.               (label_ref (match_operand 0 "" ""))
  2032.               (pc)))]
  2033.   ""
  2034.   "bhs %l0")
  2035.  
  2036. (define_insn "ble"
  2037.   [(set (pc)
  2038.     (if_then_else (le (cc0)
  2039.               (const_int 0))
  2040.               (label_ref (match_operand 0 "" ""))
  2041.               (pc)))]
  2042.   ""
  2043.   "ble %l0")
  2044.  
  2045. (define_insn "bleu"
  2046.   [(set (pc)
  2047.     (if_then_else (leu (cc0)
  2048.                (const_int 0))
  2049.               (label_ref (match_operand 0 "" ""))
  2050.               (pc)))]
  2051.   ""
  2052.   "bls %l0")
  2053.  
  2054. (define_insn ""
  2055.   [(set (pc)
  2056.     (if_then_else (eq (cc0)
  2057.               (const_int 0))
  2058.               (pc)
  2059.               (label_ref (match_operand 0 "" ""))))]
  2060.   ""
  2061.   "*
  2062. { if (cc_prev_status.flags & CC_Z_IN_F)
  2063.     return \"bfs %l0\";
  2064.   else if (cc_prev_status.flags & CC_Z_IN_NOT_F)
  2065.     return \"bfc %l0\";
  2066.   else return \"bne %l0\";
  2067. }")
  2068.  
  2069. (define_insn ""
  2070.   [(set (pc)
  2071.     (if_then_else (ne (cc0)
  2072.               (const_int 0))
  2073.               (pc)
  2074.               (label_ref (match_operand 0 "" ""))))]
  2075.   ""
  2076.   "*
  2077. { if (cc_prev_status.flags & CC_Z_IN_F)
  2078.     return \"bfc %l0\";
  2079.   else if (cc_prev_status.flags & CC_Z_IN_NOT_F)
  2080.     return \"bfs %l0\";
  2081.   else return \"beq %l0\";
  2082. }")
  2083.  
  2084. (define_insn ""
  2085.   [(set (pc)
  2086.     (if_then_else (gt (cc0)
  2087.               (const_int 0))
  2088.               (pc)
  2089.               (label_ref (match_operand 0 "" ""))))]
  2090.   ""
  2091.   "ble %l0")
  2092.  
  2093. (define_insn ""
  2094.   [(set (pc)
  2095.     (if_then_else (gtu (cc0)
  2096.                (const_int 0))
  2097.               (pc)
  2098.               (label_ref (match_operand 0 "" ""))))]
  2099.   ""
  2100.   "bls %l0")
  2101.  
  2102. (define_insn ""
  2103.   [(set (pc)
  2104.     (if_then_else (lt (cc0)
  2105.               (const_int 0))
  2106.               (pc)
  2107.               (label_ref (match_operand 0 "" ""))))]
  2108.   ""
  2109.   "bge %l0")
  2110.  
  2111. (define_insn ""
  2112.   [(set (pc)
  2113.     (if_then_else (ltu (cc0)
  2114.                (const_int 0))
  2115.               (pc)
  2116.               (label_ref (match_operand 0 "" ""))))]
  2117.   ""
  2118.   "bhs %l0")
  2119.  
  2120. (define_insn ""
  2121.   [(set (pc)
  2122.     (if_then_else (ge (cc0)
  2123.               (const_int 0))
  2124.               (pc)
  2125.               (label_ref (match_operand 0 "" ""))))]
  2126.   ""
  2127.   "blt %l0")
  2128.  
  2129. (define_insn ""
  2130.   [(set (pc)
  2131.     (if_then_else (geu (cc0)
  2132.                (const_int 0))
  2133.               (pc)
  2134.               (label_ref (match_operand 0 "" ""))))]
  2135.   ""
  2136.   "blo %l0")
  2137.  
  2138. (define_insn ""
  2139.   [(set (pc)
  2140.     (if_then_else (le (cc0)
  2141.               (const_int 0))
  2142.               (pc)
  2143.               (label_ref (match_operand 0 "" ""))))]
  2144.   ""
  2145.   "bgt %l0")
  2146.  
  2147. (define_insn ""
  2148.   [(set (pc)
  2149.     (if_then_else (leu (cc0)
  2150.                (const_int 0))
  2151.               (pc)
  2152.               (label_ref (match_operand 0 "" ""))))]
  2153.   ""
  2154.   "bhi %l0")
  2155.  
  2156. ;; Subtract-and-jump and Add-and-jump insns.
  2157. ;; These can actually be used for adding numbers in the range -8 to 7
  2158.  
  2159. (define_insn ""
  2160.   [(set (pc)
  2161.     (if_then_else
  2162.      (ne (minus:SI (match_operand:SI 0 "general_operand" "+g")
  2163.                (match_operand:SI 1 "general_operand" "i"))
  2164.          (const_int 0))
  2165.      (label_ref (match_operand 2 "" ""))
  2166.      (pc)))
  2167.   (set (match_dup 0)
  2168.        (minus:SI (match_dup 0)
  2169.          (match_dup 1)))]
  2170.   "GET_CODE (operands[1]) == CONST_INT
  2171.    && INTVAL (operands[1]) > -8 && INTVAL (operands[1]) <= 8"
  2172.   "acbd %$%n1,%0,%l2")
  2173.  
  2174. (define_insn ""
  2175.   [(set (pc)
  2176.     (if_then_else
  2177.      (ne (plus:SI (match_operand:SI 0 "general_operand" "+g")
  2178.               (match_operand:SI 1 "general_operand" "i"))
  2179.          (const_int 0))
  2180.      (label_ref (match_operand 2 "" ""))
  2181.      (pc)))
  2182.   (set (match_dup 0)
  2183.        (plus:SI (match_dup 0)
  2184.         (match_dup 1)))]
  2185.   "GET_CODE (operands[1]) == CONST_INT
  2186.    && INTVAL (operands[1]) >= -8 && INTVAL (operands[1]) < 8"
  2187.   "acbd %1,%0,%l2")
  2188.  
  2189. ;; Reversed
  2190.  
  2191. (define_insn ""
  2192.   [(set (pc)
  2193.     (if_then_else
  2194.      (eq (minus:SI (match_operand:SI 0 "general_operand" "+g")
  2195.                (match_operand:SI 1 "general_operand" "i"))
  2196.          (const_int 0))
  2197.      (pc)
  2198.      (label_ref (match_operand 2 "" ""))))
  2199.   (set (match_dup 0)
  2200.        (minus:SI (match_dup 0)
  2201.          (match_dup 1)))]
  2202.   "GET_CODE (operands[1]) == CONST_INT
  2203.    && INTVAL (operands[1]) > -8 && INTVAL (operands[1]) <= 8"
  2204.   "acbd %$%n1,%0,%l2")
  2205.  
  2206. (define_insn ""
  2207.   [(set (pc)
  2208.     (if_then_else
  2209.      (eq (plus:SI (match_operand:SI 0 "general_operand" "+g")
  2210.               (match_operand:SI 1 "general_operand" "i"))
  2211.          (const_int 0))
  2212.      (pc)
  2213.      (label_ref (match_operand 2 "" ""))))
  2214.   (set (match_dup 0)
  2215.        (plus:SI (match_dup 0)
  2216.         (match_dup 1)))]
  2217.   "GET_CODE (operands[1]) == CONST_INT
  2218.    && INTVAL (operands[1]) >= -8 && INTVAL (operands[1]) < 8"
  2219.   "acbd %1,%0,%l2")
  2220.  
  2221. (define_insn "call"
  2222.   [(call (match_operand:QI 0 "general_operand" "g")
  2223.      (match_operand:QI 1 "general_operand" "g"))]
  2224.   ""
  2225.   "*
  2226. {
  2227.   if (GET_CODE (operands[0]) == MEM)
  2228.     {
  2229.       if (CONSTANT_ADDRESS_P (XEXP (operands[0], 0)))
  2230. #ifdef GNX_V3
  2231.     return \"bsr %0\";
  2232. #else
  2233.     return \"bsr %?%a0\";
  2234. #endif
  2235.       if (GET_CODE (XEXP (operands[0], 0)) == REG)
  2236. #ifdef GNX_V3
  2237.     return \"jsr %0\";
  2238. #else
  2239.         return \"jsr %a0\";
  2240. #endif
  2241.     }
  2242.   return \"jsr %0\";
  2243. }")
  2244.  
  2245. (define_insn "call_value"
  2246.   [(set (match_operand 0 "" "=fg")
  2247.     (call (match_operand:QI 1 "general_operand" "g")
  2248.           (match_operand:QI 2 "general_operand" "g")))]
  2249.   ""
  2250.   "*
  2251. {
  2252.   if (GET_CODE (operands[1]) == MEM)
  2253.     {
  2254.       if (CONSTANT_ADDRESS_P (XEXP (operands[1], 0)))
  2255. #ifdef GNX_V3
  2256.     return \"bsr %1\";
  2257. #else
  2258.     return \"bsr %?%a1\";
  2259. #endif
  2260.       if (GET_CODE (XEXP (operands[1], 0)) == REG)
  2261. #ifdef GNX_V3
  2262.     return \"jsr %1\";
  2263. #else
  2264.         return \"jsr %a1\";
  2265. #endif
  2266.     }
  2267.   return \"jsr %1\";
  2268. }")
  2269.  
  2270. (define_insn "return"
  2271.   [(return)]
  2272.   "0"
  2273.   "ret 0")
  2274.  
  2275. (define_insn "abssf2"
  2276.   [(set (match_operand:SF 0 "general_operand" "=fm<")
  2277.     (abs:SF (match_operand:SF 1 "general_operand" "fmF")))]
  2278.   "TARGET_32081"
  2279.   "absf %1,%0")
  2280.  
  2281. (define_insn "absdf2"
  2282.   [(set (match_operand:DF 0 "general_operand" "=fm<")
  2283.     (abs:DF (match_operand:DF 1 "general_operand" "fmF")))]
  2284.   "TARGET_32081"
  2285.   "absl %1,%0")
  2286.  
  2287. (define_insn "abssi2"
  2288.   [(set (match_operand:SI 0 "general_operand" "=g<")
  2289.     (abs:SI (match_operand:SI 1 "general_operand" "rmn")))]
  2290.   ""
  2291.   "absd %1,%0")
  2292.  
  2293. (define_insn "abshi2"
  2294.   [(set (match_operand:HI 0 "general_operand" "=g<")
  2295.     (abs:HI (match_operand:HI 1 "general_operand" "g")))]
  2296.   ""
  2297.   "absw %1,%0")
  2298.  
  2299. (define_insn "absqi2"
  2300.   [(set (match_operand:QI 0 "general_operand" "=g<")
  2301.     (abs:QI (match_operand:QI 1 "general_operand" "g")))]
  2302.   ""
  2303.   "absb %1,%0")
  2304.  
  2305. (define_insn "nop"
  2306.   [(const_int 0)]
  2307.   ""
  2308.   "nop")
  2309.  
  2310. ;;(define_insn "tablejump"
  2311. ;;  [(set (pc)
  2312. ;;    (plus:SI (match_operand:SI 0 "general_operand" "g")
  2313. ;;         (pc)))]
  2314. ;;  ""
  2315. ;;  "cased %0")
  2316.  
  2317. (define_insn "tablejump"
  2318.   [(set (pc)
  2319.     (plus:SI (pc) (match_operand:HI 0 "general_operand" "g")))
  2320.    (use (label_ref (match_operand 1 "" "")))]
  2321.   ""
  2322.   "*
  2323. {
  2324.   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"LI\",
  2325.                  CODE_LABEL_NUMBER (operands[1]));
  2326.   return \"casew %0\";
  2327. }")
  2328.  
  2329. ;;(define_insn ""
  2330. ;;  [(set (pc)
  2331. ;;    (plus:SI (match_operand:QI 0 "general_operand" "g")
  2332. ;;         (pc)))]
  2333. ;;  ""
  2334. ;;  "caseb %0")
  2335.  
  2336. ;; Scondi instructions
  2337. (define_insn "seq"
  2338.   [(set (match_operand:SI 0 "general_operand" "=g<")
  2339.     (eq (cc0) (const_int 0)))]
  2340.   ""
  2341.   "*
  2342. { if (cc_prev_status.flags & CC_Z_IN_F)
  2343.     return \"sfcd %0\";
  2344.   else if (cc_prev_status.flags & CC_Z_IN_NOT_F)
  2345.     return \"sfsd %0\";
  2346.   else return \"seqd %0\";
  2347. }")
  2348.  
  2349. (define_insn ""
  2350.   [(set (match_operand:HI 0 "general_operand" "=g<")
  2351.     (eq (cc0) (const_int 0)))]
  2352.   ""
  2353.   "*
  2354. { if (cc_prev_status.flags & CC_Z_IN_F)
  2355.     return \"sfcw %0\";
  2356.   else if (cc_prev_status.flags & CC_Z_IN_NOT_F)
  2357.     return \"sfsw %0\";
  2358.   else return \"seqw %0\";
  2359. }")
  2360.  
  2361. (define_insn ""
  2362.   [(set (match_operand:QI 0 "general_operand" "=g<")
  2363.     (eq (cc0) (const_int 0)))]
  2364.   ""
  2365.   "*
  2366. { if (cc_prev_status.flags & CC_Z_IN_F)
  2367.     return \"sfcb %0\";
  2368.   else if (cc_prev_status.flags & CC_Z_IN_NOT_F)
  2369.     return \"sfsb %0\";
  2370.   else return \"seqb %0\";
  2371. }")
  2372.  
  2373. (define_insn "sne"
  2374.   [(set (match_operand:SI 0 "general_operand" "=g<")
  2375.     (ne (cc0) (const_int 0)))]
  2376.   ""
  2377.   "*
  2378. { if (cc_prev_status.flags & CC_Z_IN_F)
  2379.     return \"sfsd %0\";
  2380.   else if (cc_prev_status.flags & CC_Z_IN_NOT_F)
  2381.     return \"sfcd %0\";
  2382.   else return \"sned %0\";
  2383. }")
  2384.  
  2385. (define_insn ""
  2386.   [(set (match_operand:HI 0 "general_operand" "=g<")
  2387.     (ne (cc0) (const_int 0)))]
  2388.   ""
  2389.   "*
  2390. { if (cc_prev_status.flags & CC_Z_IN_F)
  2391.     return \"sfsw %0\";
  2392.   else if (cc_prev_status.flags & CC_Z_IN_NOT_F)
  2393.     return \"sfcw %0\";
  2394.   else return \"snew %0\";
  2395. }")
  2396.  
  2397. (define_insn ""
  2398.   [(set (match_operand:QI 0 "general_operand" "=g<")
  2399.     (ne (cc0) (const_int 0)))]
  2400.   ""
  2401.   "*
  2402. { if (cc_prev_status.flags & CC_Z_IN_F)
  2403.     return \"sfsb %0\";
  2404.   else if (cc_prev_status.flags & CC_Z_IN_NOT_F)
  2405.     return \"sfcb %0\";
  2406.   else return \"sneb %0\";
  2407. }")
  2408.  
  2409. (define_insn "sgt"
  2410.   [(set (match_operand:SI 0 "general_operand" "=g<")
  2411.     (gt (cc0) (const_int 0)))]
  2412.   ""
  2413.   "sgtd %0")
  2414.  
  2415. (define_insn ""
  2416.   [(set (match_operand:HI 0 "general_operand" "=g<")
  2417.     (gt (cc0) (const_int 0)))]
  2418.   ""
  2419.   "sgtw %0")
  2420.  
  2421. (define_insn ""
  2422.   [(set (match_operand:QI 0 "general_operand" "=g<")
  2423.     (gt (cc0) (const_int 0)))]
  2424.   ""
  2425.   "sgtb %0")
  2426.  
  2427. (define_insn "sgtu"
  2428.   [(set (match_operand:SI 0 "general_operand" "=g<")
  2429.     (gtu (cc0) (const_int 0)))]
  2430.   ""
  2431.   "shid %0")
  2432.  
  2433. (define_insn ""
  2434.   [(set (match_operand:HI 0 "general_operand" "=g<")
  2435.     (gtu (cc0) (const_int 0)))]
  2436.   ""
  2437.   "shiw %0")
  2438.  
  2439. (define_insn ""
  2440.   [(set (match_operand:QI 0 "general_operand" "=g<")
  2441.     (gtu (cc0) (const_int 0)))]
  2442.   ""
  2443.   "shib %0")
  2444.  
  2445. (define_insn "slt"
  2446.   [(set (match_operand:SI 0 "general_operand" "=g<")
  2447.     (lt (cc0) (const_int 0)))]
  2448.   ""
  2449.   "sltd %0")
  2450.  
  2451. (define_insn ""
  2452.   [(set (match_operand:HI 0 "general_operand" "=g<")
  2453.     (lt (cc0) (const_int 0)))]
  2454.   ""
  2455.   "sltw %0")
  2456.  
  2457. (define_insn ""
  2458.   [(set (match_operand:QI 0 "general_operand" "=g<")
  2459.     (lt (cc0) (const_int 0)))]
  2460.   ""
  2461.   "sltb %0")
  2462.  
  2463. (define_insn "sltu"
  2464.   [(set (match_operand:SI 0 "general_operand" "=g<")
  2465.     (ltu (cc0) (const_int 0)))]
  2466.   ""
  2467.   "slod %0")
  2468.  
  2469. (define_insn ""
  2470.   [(set (match_operand:HI 0 "general_operand" "=g<")
  2471.     (ltu (cc0) (const_int 0)))]
  2472.   ""
  2473.   "slow %0")
  2474.  
  2475. (define_insn ""
  2476.   [(set (match_operand:QI 0 "general_operand" "=g<")
  2477.     (ltu (cc0) (const_int 0)))]
  2478.   ""
  2479.   "slob %0")
  2480.  
  2481. (define_insn "sge"
  2482.   [(set (match_operand:SI 0 "general_operand" "=g<")
  2483.     (ge (cc0) (const_int 0)))]
  2484.   ""
  2485.   "sged %0")
  2486.  
  2487. (define_insn ""
  2488.   [(set (match_operand:HI 0 "general_operand" "=g<")
  2489.     (ge (cc0) (const_int 0)))]
  2490.   ""
  2491.   "sgew %0")
  2492.  
  2493. (define_insn ""
  2494.   [(set (match_operand:QI 0 "general_operand" "=g<")
  2495.     (ge (cc0) (const_int 0)))]
  2496.   ""
  2497.   "sgeb %0")
  2498.  
  2499. (define_insn "sgeu"
  2500.   [(set (match_operand:SI 0 "general_operand" "=g<")
  2501.     (geu (cc0) (const_int 0)))]
  2502.   ""
  2503.   "shsd %0")  
  2504.  
  2505. (define_insn ""
  2506.   [(set (match_operand:HI 0 "general_operand" "=g<")
  2507.     (geu (cc0) (const_int 0)))]
  2508.   ""
  2509.   "shsw %0")  
  2510.  
  2511. (define_insn ""
  2512.   [(set (match_operand:QI 0 "general_operand" "=g<")
  2513.     (geu (cc0) (const_int 0)))]
  2514.   ""
  2515.   "shsb %0")  
  2516.  
  2517. (define_insn "sle"
  2518.   [(set (match_operand:SI 0 "general_operand" "=g<")
  2519.     (le (cc0) (const_int 0)))]
  2520.   ""
  2521.   "sled %0")
  2522.  
  2523. (define_insn ""
  2524.   [(set (match_operand:HI 0 "general_operand" "=g<")
  2525.     (le (cc0) (const_int 0)))]
  2526.   ""
  2527.   "slew %0")
  2528.  
  2529. (define_insn ""
  2530.   [(set (match_operand:QI 0 "general_operand" "=g<")
  2531.     (le (cc0) (const_int 0)))]
  2532.   ""
  2533.   "sleb %0")
  2534.  
  2535. (define_insn "sleu"
  2536.   [(set (match_operand:SI 0 "general_operand" "=g<")
  2537.     (leu (cc0) (const_int 0)))]
  2538.   ""
  2539.   "slsd %0")
  2540.  
  2541. (define_insn ""
  2542.   [(set (match_operand:HI 0 "general_operand" "=g<")
  2543.     (leu (cc0) (const_int 0)))]
  2544.   ""
  2545.   "slsw %0")
  2546.  
  2547. (define_insn ""
  2548.   [(set (match_operand:QI 0 "general_operand" "=g<")
  2549.     (leu (cc0) (const_int 0)))]
  2550.   ""
  2551.   "slsb %0")
  2552.  
  2553. ;;- Local variables:
  2554. ;;- mode:emacs-lisp
  2555. ;;- comment-start: ";;- "
  2556. ;;- eval: (set-syntax-table (copy-sequence (syntax-table)))
  2557. ;;- eval: (modify-syntax-entry ?[ "(]")
  2558. ;;- eval: (modify-syntax-entry ?] ")[")
  2559. ;;- eval: (modify-syntax-entry ?{ "(}")
  2560. ;;- eval: (modify-syntax-entry ?} "){")
  2561. ;;- End:
  2562.